Skip to content

Commit 7018995

Browse files
ConditionalDetailsService, UnauthenticatedException, Refresh Token API
Minimize the use of AdminDetailsService and CustomerDetailsService -> ConditionalDetailsService Modify an error message in UnauthenticatedException Fix an error on the exposed refresh token API, /api/v1/traditional-oauth/token
1 parent 495d098 commit 7018995

File tree

9 files changed

+63
-71
lines changed

9 files changed

+63
-71
lines changed

deploy.sh

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
#!/bin/bash
22
local_maven_repo='/mnt/c/Users/Andrew\sKang/.m2/repository/com/patternknife/securityhelper/oauth2/spring-security-oauth2-password-jpa-implementation'
33
mvn -DaltDeploymentRepository=snapshot-repo::default::file://${local_maven_repo}/snapshots clean deploy
4+

src/main/java/com/patternknife/securityhelper/oauth2/config/response/error/GlobalExceptionHandler.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33

44
import com.patternknife.securityhelper.oauth2.config.logger.dto.ErrorDetails;
5-
import com.patternknife.securityhelper.oauth2.config.response.error.exception.ErrorMessagesContainedException;
5+
import com.patternknife.securityhelper.oauth2.config.response.error.exception.ErrorMessagesContainedExceptionForSecurityAuthentication;
66
import com.patternknife.securityhelper.oauth2.config.response.error.exception.auth.*;
77
import com.patternknife.securityhelper.oauth2.config.response.error.exception.data.*;
88
import com.patternknife.securityhelper.oauth2.config.response.error.exception.file.FileNotFoundException;
@@ -46,8 +46,8 @@ public class GlobalExceptionHandler {
4646
@ExceptionHandler({InsufficientAuthenticationException.class, UnauthenticatedException.class, AuthenticationException.class})
4747
public ResponseEntity<?> authenticationException(Exception ex, WebRequest request) {
4848
ErrorDetails errorDetails;
49-
if(ex instanceof ErrorMessagesContainedException && ((ErrorMessagesContainedException) ex).getErrorMessages() != null) {
50-
errorDetails = new ErrorDetails(((ErrorMessagesContainedException) ex).getErrorMessages(),
49+
if(ex instanceof ErrorMessagesContainedExceptionForSecurityAuthentication && ((ErrorMessagesContainedExceptionForSecurityAuthentication) ex).getErrorMessages() != null) {
50+
errorDetails = new ErrorDetails(((ErrorMessagesContainedExceptionForSecurityAuthentication) ex).getErrorMessages(),
5151
ex, request.getDescription(false), CustomExceptionUtils.getAllStackTraces(ex),
5252
CustomExceptionUtils.getAllCauses(ex), null);
5353
}else {

src/main/java/com/patternknife/securityhelper/oauth2/config/security/provider/auth/endpoint/CustomAuthenticationProvider.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public Authentication authenticate(Authentication authentication)
6363
throw new IllegalStateException(SecurityExceptionMessage.WRONG_GRANT_TYPE.getMessage());
6464
}
6565

66-
OAuth2Authorization oAuth2Authorization = commonOAuth2AuthorizationCycle.run(userDetails, ((CustomGrantAuthenticationToken) authentication).getGrantType(), clientId, ((CustomGrantAuthenticationToken) authentication).getAdditionalParameters());
66+
OAuth2Authorization oAuth2Authorization = commonOAuth2AuthorizationCycle.run(userDetails, ((CustomGrantAuthenticationToken) authentication).getGrantType(), clientId, ((CustomGrantAuthenticationToken) authentication).getAdditionalParameters(), null);
6767

6868
RegisteredClient registeredClient = oAuth2ClientAuthenticationToken.getRegisteredClient();
6969

src/main/java/com/patternknife/securityhelper/oauth2/config/security/provider/auth/introspectionendpoint/Oauth2OpaqueTokenAuthenticationProvider.java

+7-23
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
package com.patternknife.securityhelper.oauth2.config.security.provider.auth.introspectionendpoint;
22

3-
import com.patternknife.securityhelper.oauth2.config.response.error.exception.auth.UnauthenticatedException;
4-
import com.patternknife.securityhelper.oauth2.config.response.error.message.SecurityExceptionMessage;
5-
import com.patternknife.securityhelper.oauth2.config.security.serivce.persistence.authorization.OAuth2AuthorizationServiceImpl;
63
import com.patternknife.securityhelper.oauth2.config.security.principal.AccessTokenUserInfo;
7-
import com.patternknife.securityhelper.oauth2.config.security.principal.AdditionalAccessTokenUserInfo;
8-
import com.patternknife.securityhelper.oauth2.config.security.serivce.userdetail.AdminDetailsService;
9-
import com.patternknife.securityhelper.oauth2.config.security.serivce.userdetail.CustomerDetailsService;
4+
import com.patternknife.securityhelper.oauth2.config.security.serivce.persistence.authorization.OAuth2AuthorizationServiceImpl;
5+
import com.patternknife.securityhelper.oauth2.config.security.serivce.userdetail.ConditionalDetailsService;
106
import jakarta.servlet.http.HttpServletRequest;
117
import org.apache.commons.logging.Log;
128
import org.apache.commons.logging.LogFactory;
@@ -41,16 +37,15 @@ public final class Oauth2OpaqueTokenAuthenticationProvider implements Authentica
4137
private OpaqueTokenAuthenticationConverter authenticationConverter = Oauth2OpaqueTokenAuthenticationProvider::convert;
4238

4339
private final OAuth2AuthorizationServiceImpl authorizationService;
44-
private final CustomerDetailsService customerDetailsService;
45-
private final AdminDetailsService adminDetailsService;
40+
private final ConditionalDetailsService conditionalDetailsService;
41+
4642

4743
public Oauth2OpaqueTokenAuthenticationProvider(OpaqueTokenIntrospector introspector, OAuth2AuthorizationServiceImpl authorizationService,
48-
CustomerDetailsService customerDetailsService, AdminDetailsService adminDetailsService) {
44+
ConditionalDetailsService conditionalDetailsService) {
4945
Assert.notNull(introspector, "introspector cannot be null");
5046
this.introspector = introspector;
5147
this.authorizationService = authorizationService;
52-
this.customerDetailsService = customerDetailsService;
53-
this.adminDetailsService = adminDetailsService;
48+
this.conditionalDetailsService = conditionalDetailsService;
5449
}
5550

5651
@Override
@@ -117,18 +112,7 @@ public BearerTokenAuthentication convert(HttpServletRequest httpServletRequest)
117112
return null;
118113
}
119114

120-
OAuth2AuthenticatedPrincipal oAuth2AuthenticatedPrincipal = null;
121-
if (oAuth2Authorization.getAttributes().get("client_id").equals(AdditionalAccessTokenUserInfo.UserType.ADMIN.getValue())) {
122-
oAuth2AuthenticatedPrincipal = (AccessTokenUserInfo) adminDetailsService.loadUserByUsername(oAuth2Authorization.getPrincipalName());
123-
} else if (oAuth2Authorization.getAttributes().get("client_id").equals(AdditionalAccessTokenUserInfo.UserType.CUSTOMER.getValue())) {
124-
oAuth2AuthenticatedPrincipal = (AccessTokenUserInfo)customerDetailsService.loadUserByUsername(oAuth2Authorization.getPrincipalName());
125-
} else {
126-
return null;
127-
}
128-
129-
if(oAuth2AuthenticatedPrincipal == null){
130-
throw new UnauthenticatedException(SecurityExceptionMessage.AUTHENTICATION_FAILURE.getMessage());
131-
}
115+
OAuth2AuthenticatedPrincipal oAuth2AuthenticatedPrincipal = (AccessTokenUserInfo) conditionalDetailsService.loadUserByUsername(oAuth2Authorization.getPrincipalName(), (String)oAuth2Authorization.getAttributes().get("client_id"));
132116

133117
OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, token, oAuth2Authorization.getAccessToken().getToken().getIssuedAt(), oAuth2Authorization.getAccessToken().getToken().getExpiresAt());
134118
return new BearerTokenAuthentication(oAuth2AuthenticatedPrincipal, accessToken, oAuth2AuthenticatedPrincipal.getAuthorities());
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package com.patternknife.securityhelper.oauth2.config.security.provider.resource.introspector;
22

33

4-
import com.patternknife.securityhelper.oauth2.config.response.error.message.SecurityExceptionMessage;
54
import com.patternknife.securityhelper.oauth2.config.response.error.exception.auth.UnauthenticatedException;
6-
import com.patternknife.securityhelper.oauth2.config.security.serivce.persistence.authorization.OAuth2AuthorizationServiceImpl;
5+
import com.patternknife.securityhelper.oauth2.config.response.error.message.SecurityExceptionMessage;
76
import com.patternknife.securityhelper.oauth2.config.security.principal.AccessTokenUserInfo;
8-
import com.patternknife.securityhelper.oauth2.config.security.principal.AdditionalAccessTokenUserInfo;
9-
import com.patternknife.securityhelper.oauth2.config.security.serivce.userdetail.AdminDetailsService;
10-
import com.patternknife.securityhelper.oauth2.config.security.serivce.userdetail.CustomerDetailsService;
7+
import com.patternknife.securityhelper.oauth2.config.security.serivce.persistence.authorization.OAuth2AuthorizationServiceImpl;
8+
import com.patternknife.securityhelper.oauth2.config.security.serivce.userdetail.ConditionalDetailsService;
119
import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal;
1210
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
1311
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
@@ -18,21 +16,21 @@
1816
public class JpaTokenStoringOauth2TokenIntrospector implements OpaqueTokenIntrospector {
1917

2018

21-
private OpaqueTokenIntrospector delegate =
19+
private OpaqueTokenIntrospector delegate =
2220
new NimbusOpaqueTokenIntrospector(
2321
"http://localhost:8300/oauth2/introspect",
2422
"barClient",
2523
"barClientSecret"
2624
);
2725

2826
private final OAuth2AuthorizationServiceImpl authorizationService;
29-
private final CustomerDetailsService customerDetailsService;
30-
private final AdminDetailsService adminDetailsService;
27+
private final ConditionalDetailsService conditionalDetailsService;
28+
3129

32-
public JpaTokenStoringOauth2TokenIntrospector(OAuth2AuthorizationServiceImpl authorizationService, CustomerDetailsService customerDetailsService, AdminDetailsService adminDetailsService) {
30+
public JpaTokenStoringOauth2TokenIntrospector(OAuth2AuthorizationServiceImpl authorizationService,
31+
ConditionalDetailsService conditionalDetailsService) {
3332
this.authorizationService = authorizationService;
34-
this.customerDetailsService = customerDetailsService;
35-
this.adminDetailsService = adminDetailsService;
33+
this.conditionalDetailsService = conditionalDetailsService;
3634
}
3735

3836
@Override
@@ -46,20 +44,14 @@ public OAuth2AuthenticatedPrincipal introspect(String token) {
4644
throw new UnauthenticatedException(e.getMessage());
4745
}*/
4846

49-
OAuth2Authorization oAuth2Authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN);
47+
OAuth2Authorization oAuth2Authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN);
5048

5149
if(oAuth2Authorization == null || oAuth2Authorization.getAccessToken() == null || oAuth2Authorization.getAccessToken().isExpired()
52-
|| oAuth2Authorization.getRefreshToken() == null || oAuth2Authorization.getRefreshToken().isExpired()){
50+
|| oAuth2Authorization.getRefreshToken() == null || oAuth2Authorization.getRefreshToken().isExpired()){
5351
throw new UnauthenticatedException(SecurityExceptionMessage.AUTHENTICATION_FAILURE.getMessage());
5452
//return null;
5553
}
5654

57-
if (oAuth2Authorization.getAttributes().get("client_id").equals(AdditionalAccessTokenUserInfo.UserType.ADMIN.getValue())) {
58-
return (AccessTokenUserInfo) adminDetailsService.loadUserByUsername(oAuth2Authorization.getPrincipalName());
59-
} else if (oAuth2Authorization.getAttributes().get("client_id").equals(AdditionalAccessTokenUserInfo.UserType.CUSTOMER.getValue())) {
60-
return (AccessTokenUserInfo) customerDetailsService.loadUserByUsername(oAuth2Authorization.getPrincipalName());
61-
} else {
62-
throw new UnauthenticatedException(SecurityExceptionMessage.AUTHENTICATION_ERROR.getMessage());
63-
}
55+
return (AccessTokenUserInfo) conditionalDetailsService.loadUserByUsername(oAuth2Authorization.getPrincipalName(), (String) oAuth2Authorization.getAttributes().get("client_id"));
6456
}
6557
}

src/main/java/com/patternknife/securityhelper/oauth2/config/security/serivce/CommonOAuth2AuthorizationCycle.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.patternknife.securityhelper.oauth2.config.security.serivce;
22

3+
import jakarta.annotation.Nullable;
34
import org.springframework.security.core.userdetails.UserDetails;
45
import org.springframework.security.oauth2.core.AuthorizationGrantType;
56
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
@@ -12,6 +13,7 @@
1213
public interface CommonOAuth2AuthorizationCycle {
1314

1415
OAuth2Authorization run(UserDetails userDetails, AuthorizationGrantType authorizationGrantType,
15-
String clientId, Map<String, Object> additionalParameters);
16+
String clientId, Map<String, Object> additionalParameters,
17+
@Nullable Map<String, Object> modifiableAdditionalParameters);
1618

1719
}

src/main/java/com/patternknife/securityhelper/oauth2/config/security/serivce/CommonOAuth2AuthorizationCycleImpl.java

+15-4
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ public class CommonOAuth2AuthorizationCycleImpl implements CommonOAuth2Authoriza
3030

3131
@Override
3232
public OAuth2Authorization run(UserDetails userDetails, AuthorizationGrantType authorizationGrantType, String clientId,
33-
Map<String, Object> additionalParameters) {
33+
Map<String, Object> additionalParameters, Map<String, Object> modifiableAdditionalParameters) {
3434

3535
OAuth2Authorization oAuth2Authorization = oAuth2AuthorizationService.findByUserNameAndClientIdAndAppToken(userDetails.getUsername(), clientId, (String) additionalParameters.get(CustomHttpHeaders.APP_TOKEN));
36-
if(((String)additionalParameters.get("grant_type")).equals(AuthorizationGrantType.PASSWORD.getValue())){
36+
if(authorizationGrantType.getValue().equals(AuthorizationGrantType.PASSWORD.getValue())){
3737
if (oAuth2Authorization == null || oAuth2Authorization.getAccessToken().isExpired()) {
3838
int retryLogin = 0;
3939
while (retryLogin < 5) {
@@ -52,12 +52,21 @@ public OAuth2Authorization run(UserDetails userDetails, AuthorizationGrantType a
5252
}
5353
}
5454
}
55-
}else if(((String)additionalParameters.get("grant_type")).equals(AuthorizationGrantType.REFRESH_TOKEN.getValue())){
55+
}else if(authorizationGrantType.getValue().equals(AuthorizationGrantType.REFRESH_TOKEN.getValue())){
5656
int retryLogin = 0;
5757
while (retryLogin < 5) {
5858
try {
59+
String refreshTokenValue = null;
60+
if(additionalParameters.containsKey("refresh_token")){
61+
refreshTokenValue = (String) additionalParameters.get("refresh_token");
62+
}else{
63+
assert modifiableAdditionalParameters != null;
64+
refreshTokenValue = (String)modifiableAdditionalParameters.get("refresh_token");
65+
}
66+
assert refreshTokenValue != null;
67+
5968

60-
OAuth2Authorization oAuth2AuthorizationFromRefreshToken = oAuth2AuthorizationService.findByToken((String)additionalParameters.get("refresh_token"), OAuth2TokenType.REFRESH_TOKEN);
69+
OAuth2Authorization oAuth2AuthorizationFromRefreshToken = oAuth2AuthorizationService.findByToken(refreshTokenValue, OAuth2TokenType.REFRESH_TOKEN);
6170

6271
if(oAuth2AuthorizationFromRefreshToken == null){
6372
throw new UnauthenticatedException("Refresh Token Expired.");
@@ -85,6 +94,8 @@ public OAuth2Authorization run(UserDetails userDetails, AuthorizationGrantType a
8594
}
8695
}
8796

97+
}else{
98+
// TO DO.
8899
}
89100

90101

0 commit comments

Comments
 (0)