diff --git a/package-lock.json b/package-lock.json index 4962f30e1ce9248817464c643d2268194b2c31a9..e92b223e3fdef6dcc829ee89a5def82d76f60a4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,13 @@ "license": "UNLICENSED", "dependencies": { "@angular/animations": "13.1.3", - "@angular/cdk": "^13.1.3", + "@angular/cdk": "^13.3.9", "@angular/common": "13.1.3", "@angular/compiler": "13.1.3", "@angular/core": "13.1.3", "@angular/forms": "13.1.3", "@angular/localize": "13.1.3", - "@angular/material": "^13.1.3", + "@angular/material": "^13.3.9", "@angular/platform-browser": "13.1.3", "@angular/platform-browser-dynamic": "13.1.3", "@angular/router": "13.1.3", @@ -1341,9 +1341,9 @@ } }, "node_modules/@angular/cdk": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.2.2.tgz", - "integrity": "sha512-cT5DIaz+NI9IGb3X61Wh26+L6zdRcOXT1BP37iRbK2Qa2qM8/0VNeK6hrBBIblyoHKR/WUmRlS8XYf6mmArpZw==", + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.9.tgz", + "integrity": "sha512-XCuCbeuxWFyo3EYrgEYx7eHzwl76vaWcxtWXl00ka8d+WAOtMQ6Tf1D98ybYT5uwF9889fFpXAPw98mVnlo3MA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1636,15 +1636,15 @@ } }, "node_modules/@angular/material": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.2.2.tgz", - "integrity": "sha512-YAjPp2+/wuEOPfkAxdRVdbWHiK4P3DgMZa9qP/NizN2lTXNrftEfD09ZlPIFMZRnnExezJ2LnO7eyELpc1VSKg==", + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.9.tgz", + "integrity": "sha512-FU8lcMgo+AL8ckd27B4V097ZPoIZNRHiCe3wpgkImT1qC0YwcyXZVn0MqQTTFSdC9a/aI8wPm3AbTClJEVw5Vw==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^13.0.0 || ^14.0.0-0", - "@angular/cdk": "13.2.2", + "@angular/cdk": "13.3.9", "@angular/common": "^13.0.0 || ^14.0.0-0", "@angular/core": "^13.0.0 || ^14.0.0-0", "@angular/forms": "^13.0.0 || ^14.0.0-0", @@ -26782,9 +26782,9 @@ } }, "@angular/cdk": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.2.2.tgz", - "integrity": "sha512-cT5DIaz+NI9IGb3X61Wh26+L6zdRcOXT1BP37iRbK2Qa2qM8/0VNeK6hrBBIblyoHKR/WUmRlS8XYf6mmArpZw==", + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.9.tgz", + "integrity": "sha512-XCuCbeuxWFyo3EYrgEYx7eHzwl76vaWcxtWXl00ka8d+WAOtMQ6Tf1D98ybYT5uwF9889fFpXAPw98mVnlo3MA==", "requires": { "parse5": "^5.0.0", "tslib": "^2.3.0" @@ -26980,9 +26980,9 @@ } }, "@angular/material": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.2.2.tgz", - "integrity": "sha512-YAjPp2+/wuEOPfkAxdRVdbWHiK4P3DgMZa9qP/NizN2lTXNrftEfD09ZlPIFMZRnnExezJ2LnO7eyELpc1VSKg==", + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.9.tgz", + "integrity": "sha512-FU8lcMgo+AL8ckd27B4V097ZPoIZNRHiCe3wpgkImT1qC0YwcyXZVn0MqQTTFSdC9a/aI8wPm3AbTClJEVw5Vw==", "requires": { "tslib": "^2.3.0" } diff --git a/package.json b/package.json index 068983bafd5846b6933205ef733bdb52b045d64a..95446a4897e7363d1fad071d6a0da27c2d8587bb 100644 --- a/package.json +++ b/package.json @@ -86,13 +86,13 @@ }, "dependencies": { "@angular/animations": "13.1.3", - "@angular/cdk": "^13.1.3", + "@angular/cdk": "^13.3.9", "@angular/common": "13.1.3", "@angular/compiler": "13.1.3", "@angular/core": "13.1.3", "@angular/forms": "13.1.3", "@angular/localize": "13.1.3", - "@angular/material": "^13.1.3", + "@angular/material": "^13.3.9", "@angular/platform-browser": "13.1.3", "@angular/platform-browser-dynamic": "13.1.3", "@angular/router": "13.1.3", diff --git a/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java b/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java index 868dae0d60210860cebebb3791827e410cab9843..80283d7070521f491b00864bf56a4d7a098ff112 100644 --- a/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java +++ b/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java @@ -2,27 +2,18 @@ package at.ac.uibk.gitsearch.config; import static org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED_VALUE; -import at.ac.uibk.gitsearch.security.AuthoritiesConstants; -import at.ac.uibk.gitsearch.security.jwt.JWTConfigurer; -import at.ac.uibk.gitsearch.security.jwt.TokenProvider; -import at.ac.uibk.gitsearch.security.oauth2.GitSearchOAuth2AuthenticationToken; -import at.ac.uibk.gitsearch.security.oauth2.GitSearchOAuth2AuthorizationRequestRepository; -import at.ac.uibk.gitsearch.security.oauth2.SavedRequestAwareAuthenticationSuccessHandlerWithJWTSupport; -import at.ac.uibk.gitsearch.security.oauth2.UserDetailsFetcher; -import at.ac.uibk.gitsearch.service.UserService; -import at.ac.uibk.gitsearch.service.dto.AdminUserDTO; -import at.ac.uibk.gitsearch.service.mapper.UserMapper; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URI; -import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; + import javax.servlet.DispatcherType; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Value; @@ -39,7 +30,6 @@ import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.config.annotation.ObjectPostProcessor; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.HttpSecurityBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -72,7 +62,6 @@ import org.springframework.security.oauth2.core.endpoint.PkceParameterNames; import org.springframework.security.oauth2.core.oidc.OidcUserInfo; import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; import org.springframework.security.oauth2.core.oidc.user.OidcUser; -import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.security.oauth2.jwt.JwtDecoder; import org.springframework.security.oauth2.jwt.JwtDecoders; import org.springframework.security.oauth2.jwt.JwtValidators; @@ -92,9 +81,21 @@ import org.springframework.web.filter.ForwardedHeaderFilter; import org.springframework.web.util.UriComponentsBuilder; import org.zalando.problem.spring.web.advice.security.SecurityProblemSupport; +import at.ac.uibk.gitsearch.security.AuthoritiesConstants; +import at.ac.uibk.gitsearch.security.jwt.JWTConfigurer; +import at.ac.uibk.gitsearch.security.jwt.TokenProvider; +import at.ac.uibk.gitsearch.security.oauth2.GitSearchOAuth2AuthenticationToken; +import at.ac.uibk.gitsearch.security.oauth2.GitSearchOAuth2AuthorizationRequestRepository; +import at.ac.uibk.gitsearch.security.oauth2.SavedRequestAwareAuthenticationSuccessHandlerWithJWTSupport; +import at.ac.uibk.gitsearch.security.oauth2.UserDetailsFetcher; +import at.ac.uibk.gitsearch.service.UserService; +import at.ac.uibk.gitsearch.service.dto.AdminUserDTO; +import at.ac.uibk.gitsearch.service.mapper.UserMapper; + @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) @Import(SecurityProblemSupport.class) +@java.lang.SuppressWarnings("PMD") public class SecurityConfiguration extends WebSecurityConfigurerAdapter { private static final Logger logger = LogManager.getLogger(SecurityConfiguration.class); @@ -251,8 +252,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { if (object instanceof OAuth2LoginAuthenticationFilter) { OAuth2LoginAuthenticationFilter oAuthLoginFilter = (OAuth2LoginAuthenticationFilter) object; oAuthLoginFilter.setAuthenticationResultConverter((OAuth2LoginAuthenticationToken authenticationResult) -> { - OAuth2AuthenticationToken authToken = new GitSearchOAuth2AuthenticationToken(authenticationResult); - return authToken; + return new GitSearchOAuth2AuthenticationToken(authenticationResult); }); } return object; @@ -267,34 +267,6 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { return jwtAuthenticationConverter; } - /** - * this is unfortunately an hard core access to the oauth2 Login Authentication Filter. - * This is required in order to set the Authentication Converter, which is not available via OAuth2LoginConfigurer. - * If you have a better idea, you are welcome. - * - * @param c the OAuth2LoginConfigurer - * @return the Filter (if accessible) - */ - private static final Optional<OAuth2LoginAuthenticationFilter> getOAuth2AuthenticationFilterFromConfig( - OAuth2LoginConfigurer<HttpSecurity> c - ) { - try { - final Method getFilterMethod = AbstractAuthenticationFilterConfigurer.class.getDeclaredMethod("getAuthenticationFilter"); - getFilterMethod.setAccessible(true); - return Optional.ofNullable((OAuth2LoginAuthenticationFilter) getFilterMethod.invoke(c)); - } catch ( - NullPointerException - | IllegalAccessException - | IllegalArgumentException - | InvocationTargetException - | NoSuchMethodException - | SecurityException e - ) { - logger.warn("Cannot get OAuth2LoginAuthenticationFilter :-(", e); - return Optional.empty(); - } - } - private JWTConfigurer securityConfigurerAdapter() { return new JWTConfigurer(tokenProvider); } diff --git a/src/main/java/at/ac/uibk/gitsearch/security/oauth2/GitSearchOAuth2AuthenticationToken.java b/src/main/java/at/ac/uibk/gitsearch/security/oauth2/GitSearchOAuth2AuthenticationToken.java index f9f88d04552c5fe6e3a4d2d7bcfe8665a031bc7e..cde913274820970ff1f3ed6604d0e9f86fac881f 100644 --- a/src/main/java/at/ac/uibk/gitsearch/security/oauth2/GitSearchOAuth2AuthenticationToken.java +++ b/src/main/java/at/ac/uibk/gitsearch/security/oauth2/GitSearchOAuth2AuthenticationToken.java @@ -10,7 +10,7 @@ public class GitSearchOAuth2AuthenticationToken extends OAuth2AuthenticationToke */ private static final long serialVersionUID = 1L; - private String redirectURL; + private final String redirectURL; public GitSearchOAuth2AuthenticationToken(OAuth2LoginAuthenticationToken authenticationResult) { super( @@ -18,12 +18,12 @@ public class GitSearchOAuth2AuthenticationToken extends OAuth2AuthenticationToke authenticationResult.getAuthorities(), authenticationResult.getClientRegistration().getRegistrationId() ); - redirectURL = + String configuredRedirectURL = authenticationResult .getAuthorizationExchange() .getAuthorizationRequest() .getAttribute(GitSearchOAuth2AuthorizationRequestRepository.REFERER_ATTRIBUTE); - if (redirectURL == null) redirectURL = "/"; + redirectURL = configuredRedirectURL!=null?configuredRedirectURL:"/"; } public String getRedirectURL() { diff --git a/src/main/java/at/ac/uibk/gitsearch/security/oauth2/GitSearchOAuth2AuthorizationRequestRepository.java b/src/main/java/at/ac/uibk/gitsearch/security/oauth2/GitSearchOAuth2AuthorizationRequestRepository.java index be7565456277f260bd97ead19641c740ab5c5bdd..e093a04971183313ef6b979a7ab72600fcae61a3 100644 --- a/src/main/java/at/ac/uibk/gitsearch/security/oauth2/GitSearchOAuth2AuthorizationRequestRepository.java +++ b/src/main/java/at/ac/uibk/gitsearch/security/oauth2/GitSearchOAuth2AuthorizationRequestRepository.java @@ -1,10 +1,11 @@ package at.ac.uibk.gitsearch.security.oauth2; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository; import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; @@ -49,7 +50,7 @@ public class GitSearchOAuth2AuthorizationRequestRepository implements Authorizat String state = authorizationRequest.getState(); Assert.hasText(state, "authorizationRequest.state cannot be empty"); String referer = request.getHeader(REFERER_ATTRIBUTE); - final Map<String, Object> requestAttributes = new HashMap<>(authorizationRequest.getAttributes()); + final Map<String, Object> requestAttributes = new ConcurrentHashMap<>(authorizationRequest.getAttributes()); requestAttributes.put(REFERER_ATTRIBUTE, referer); OAuth2AuthorizationRequest extendedAuthorizationRequest = OAuth2AuthorizationRequest .from(authorizationRequest)