Skip to content

Commit 5989b75

Browse files
fix : additional updates for the introduction
1 parent 07511ea commit 5989b75

File tree

8 files changed

+43
-35
lines changed

8 files changed

+43
-35
lines changed

README.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
# Spring Security Oauth2 Password JPA Implementation
2-
## Overview
32

4-
* Complete separation of the library (API) and the client for testing it
3+
> One OAuth2 ROPC POC built to grow with Spring Boot and ORM
54
5+
## Quick Start
66
```xml
77
<dependency>
88
<groupId>io.github.patternknife.securityhelper.oauth2.api</groupId>
99
<artifactId>spring-security-oauth2-password-jpa-implementation</artifactId>
1010
<version>3.0.0</version>
1111
</dependency>
1212
```
13+
14+
## Overview
15+
16+
* Complete separation of the library (API) and the client for testing it
17+
1318
* Set up the same access & refresh token APIs on both ``/oauth2/token`` and on our controller layer such as ``/api/v1/traditional-oauth/token``, both of which function same and have `the same request & response payloads for success and errors`. (However, ``/oauth2/token`` is the standard that "spring-authorization-server" provides.)
1419
* As you are aware, the API ``/oauth2/token`` is what "spring-authorization-server" provides.
1520
* ``/api/v1/traditional-oauth/token`` is what this library implemented directly.
@@ -50,7 +55,7 @@
5055
| Category | Dependencies |
5156
|-------------------|-------------------------------------------------------------------|
5257
| Backend-Language | Java 17 |
53-
| Backend-Framework | Spring Boot 3.3.2 |
58+
| Backend-Framework | Spring Boot 3.3.2 (the latest version) |
5459
| Main Libraries | Spring Security 6.3.1, Spring Security Authorization Server 1.3.1 |
5560
| Package-Manager | Maven 3.6.3 (mvnw, Dockerfile) |
5661
| RDBMS | Mysql 8.0.17 |
@@ -151,6 +156,9 @@ public class CommonDataSourceConfiguration {
151156
- ``client.config.securityimpl.response.CustomAuthenticationSuccessHandlerImpl``
152157
- The success response payload of "/api/v1/traditional-oauth/token" is in ``api.domain.traditionaloauth.dto`` and is not yet customizable.
153158

159+
- **Customize the verification logic for UsernamePassword and Client as desired**
160+
- ``IOauth2AuthenticationHashCheckService``
161+
154162
## Running this App with Docker
155163
* Use the following module for Blue-Green deployment:
156164
* https://github.com/patternknife/docker-blue-green-runner

client/src/main/java/com/patternknife/securityhelper/oauth2/client/config/logger/module/ResponseErrorLogConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import com.patternknife.securityhelper.oauth2.client.config.logger.common.CommonLoggingRequest;
55

66

7-
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.dto.ErrorResponsePayload;
7+
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.dto.SecurityKnifeErrorResponsePayload;
88
import org.aspectj.lang.JoinPoint;
99
import org.aspectj.lang.annotation.AfterReturning;
1010
import org.aspectj.lang.annotation.Aspect;
@@ -31,7 +31,7 @@ public void endpointAfterExceptionReturning(JoinPoint p, Object returnValue) {
3131
try {
3232
if (p.getTarget().getClass().equals(GlobalExceptionHandler.class)) {
3333

34-
ErrorResponsePayload errorResponsePayload = (ErrorResponsePayload) ((ResponseEntity) returnValue).getBody();
34+
SecurityKnifeErrorResponsePayload errorResponsePayload = (SecurityKnifeErrorResponsePayload) ((ResponseEntity) returnValue).getBody();
3535
loggedText += String.format("[After - Error Response]\n message : %s || \n userMessage : %s || \n cause : %s || \n stackTrace : %s",
3636
errorResponsePayload != null ? errorResponsePayload.getMessage() : "No error message",
3737
errorResponsePayload != null ? errorResponsePayload.getUserMessage() : "No error userMessage",

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import com.patternknife.securityhelper.oauth2.client.config.logger.module.ResponseSuccessLogConfig;
66

7-
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.dto.ErrorResponsePayload;
7+
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.dto.SecurityKnifeErrorResponsePayload;
88
import org.apache.commons.lang3.exception.ExceptionUtils;
99
import org.slf4j.Logger;
1010
import org.slf4j.LoggerFactory;
@@ -28,7 +28,7 @@ public static void createNonStoppableErrorMessage(String message) {
2828
} catch (Exception ex2) {
2929
logger.error(ex2.getMessage());
3030
} finally {
31-
ErrorResponsePayload errorResponsePayload = new ErrorResponsePayload(message, "Without error param " + " / Thread ID = " + Thread.currentThread().getId() + " / StackTrace",
31+
SecurityKnifeErrorResponsePayload errorResponsePayload = new SecurityKnifeErrorResponsePayload(message, "Without error param " + " / Thread ID = " + Thread.currentThread().getId() + " / StackTrace",
3232
message, "", "");
3333

3434
logger.error(" / " + errorResponsePayload.toString());
@@ -46,7 +46,7 @@ public static void createNonStoppableErrorMessage(String message, Throwable ex)
4646
} catch (Exception ex2) {
4747
logger.error(ex2.getMessage());
4848
} finally {
49-
ErrorResponsePayload errorResponsePayload = new ErrorResponsePayload(message, "Without error param " + " / Thread ID = " + Thread.currentThread().getId() + " / StackTrace",
49+
SecurityKnifeErrorResponsePayload errorResponsePayload = new SecurityKnifeErrorResponsePayload(message, "Without error param " + " / Thread ID = " + Thread.currentThread().getId() + " / StackTrace",
5050
message, CustomExceptionUtils.getAllStackTraces(ex), CustomExceptionUtils.getAllCauses(ex));
5151

5252
logger.error(" / " + errorResponsePayload.toString());

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import com.patternknife.securityhelper.oauth2.client.config.response.error.message.GeneralErrorMessage;
55
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.util.ExceptionKnifeUtils;
6-
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.dto.ErrorResponsePayload;
6+
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.dto.SecurityKnifeErrorResponsePayload;
77
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.exception.KnifeOauth2AuthenticationException;
88
import io.github.patternknife.securityhelper.oauth2.api.config.security.message.DefaultSecurityUserExceptionMessage;
99
import io.github.patternknife.securityhelper.oauth2.api.config.security.message.ISecurityUserExceptionMessageService;
@@ -38,13 +38,13 @@ public class GlobalExceptionHandler {
3838
// 401 : Authentication
3939
@ExceptionHandler({AuthenticationException.class})
4040
public ResponseEntity<?> authenticationException(Exception ex, WebRequest request) {
41-
ErrorResponsePayload errorResponsePayload;
41+
SecurityKnifeErrorResponsePayload errorResponsePayload;
4242
if(ex instanceof KnifeOauth2AuthenticationException && ((KnifeOauth2AuthenticationException) ex).getErrorMessages() != null) {
43-
errorResponsePayload = new ErrorResponsePayload(((KnifeOauth2AuthenticationException) ex).getErrorMessages(),
43+
errorResponsePayload = new SecurityKnifeErrorResponsePayload(((KnifeOauth2AuthenticationException) ex).getErrorMessages(),
4444
ex, request.getDescription(false), ExceptionKnifeUtils.getAllStackTraces(ex),
4545
ExceptionKnifeUtils.getAllCauses(ex), null);
4646
}else {
47-
errorResponsePayload = new ErrorResponsePayload(ExceptionKnifeUtils.getAllCauses(ex), request.getDescription(false), iSecurityUserExceptionMessageService.getUserMessage(DefaultSecurityUserExceptionMessage.AUTHENTICATION_LOGIN_FAILURE),
47+
errorResponsePayload = new SecurityKnifeErrorResponsePayload(ExceptionKnifeUtils.getAllCauses(ex), request.getDescription(false), iSecurityUserExceptionMessageService.getUserMessage(DefaultSecurityUserExceptionMessage.AUTHENTICATION_LOGIN_FAILURE),
4848
ex.getMessage(), ex.getStackTrace()[0].toString());
4949
}
5050
return new ResponseEntity<>(errorResponsePayload, HttpStatus.UNAUTHORIZED);
@@ -53,15 +53,15 @@ public ResponseEntity<?> authenticationException(Exception ex, WebRequest reques
5353
// 403 : Authorization
5454
@ExceptionHandler({ AccessDeniedException.class })
5555
public ResponseEntity<?> authorizationException(Exception ex, WebRequest request) {
56-
ErrorResponsePayload errorResponsePayload = new ErrorResponsePayload(ex.getMessage() != null ? ex.getMessage() : ExceptionKnifeUtils.getAllCauses(ex), request.getDescription(false),
56+
SecurityKnifeErrorResponsePayload errorResponsePayload = new SecurityKnifeErrorResponsePayload(ex.getMessage() != null ? ex.getMessage() : ExceptionKnifeUtils.getAllCauses(ex), request.getDescription(false),
5757
ex.getMessage() == null || ex.getMessage().equals("Access Denied") ? iSecurityUserExceptionMessageService.getUserMessage(DefaultSecurityUserExceptionMessage.AUTHORIZATION_FAILURE) : ex.getMessage(), ex.getStackTrace()[0].toString());
5858
return new ResponseEntity<>(errorResponsePayload, HttpStatus.FORBIDDEN);
5959
}
6060

6161
// Unhandled
6262
@ExceptionHandler(Exception.class)
6363
public ResponseEntity<?> unhandledExceptionHandler(Exception ex, WebRequest request) {
64-
ErrorResponsePayload errorResponsePayload = new ErrorResponsePayload(ex.getMessage(), request.getDescription(false), GeneralErrorMessage.UNHANDLED_ERROR.getUserMessage(),
64+
SecurityKnifeErrorResponsePayload errorResponsePayload = new SecurityKnifeErrorResponsePayload(ex.getMessage(), request.getDescription(false), GeneralErrorMessage.UNHANDLED_ERROR.getUserMessage(),
6565
CustomExceptionUtils.getAllStackTraces(ex), CustomExceptionUtils.getAllCauses(ex));
6666
return new ResponseEntity<>(errorResponsePayload, HttpStatus.INTERNAL_SERVER_ERROR);
6767
}

client/src/main/java/com/patternknife/securityhelper/oauth2/client/config/securityimpl/response/CustomAuthenticationFailureHandlerImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import io.github.patternknife.securityhelper.oauth2.api.config.logger.KnifeSecurityLogConfig;
66
import io.github.patternknife.securityhelper.oauth2.api.config.security.message.DefaultSecurityUserExceptionMessage;
77
import io.github.patternknife.securityhelper.oauth2.api.config.security.message.ISecurityUserExceptionMessageService;
8-
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.dto.ErrorResponsePayload;
8+
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.dto.SecurityKnifeErrorResponsePayload;
99
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.exception.KnifeOauth2AuthenticationException;
1010
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.util.ExceptionKnifeUtils;
1111
import jakarta.servlet.http.HttpServletRequest;
@@ -40,19 +40,19 @@ public class CustomAuthenticationFailureHandlerImpl implements AuthenticationFai
4040
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
4141
throws IOException {
4242

43-
ErrorResponsePayload errorResponsePayload;
43+
SecurityKnifeErrorResponsePayload errorResponsePayload;
4444
String stackTraces = ExceptionKnifeUtils.getAllStackTraces(exception);
4545
if(exception instanceof KnifeOauth2AuthenticationException){
46-
errorResponsePayload = new ErrorResponsePayload(((KnifeOauth2AuthenticationException) exception).getErrorMessages().getMessage(),
46+
errorResponsePayload = new SecurityKnifeErrorResponsePayload(((KnifeOauth2AuthenticationException) exception).getErrorMessages().getMessage(),
4747
"uri=" + request.getRequestURI(), ((KnifeOauth2AuthenticationException) exception).getErrorMessages().getUserMessage(), stackTraces);
4848
}else if(exception instanceof OAuth2AuthenticationException) {
49-
errorResponsePayload = new ErrorResponsePayload(
49+
errorResponsePayload = new SecurityKnifeErrorResponsePayload(
5050
((OAuth2AuthenticationException) exception).getError().getErrorCode() + " / " + ((OAuth2AuthenticationException) exception).getError().getDescription(),
5151
"uri=" + request.getRequestURI(),
5252
iSecurityUserExceptionMessageService.getUserMessage(DefaultSecurityUserExceptionMessage.AUTHENTICATION_LOGIN_FAILURE),
5353
stackTraces);
5454
}else{
55-
errorResponsePayload = new ErrorResponsePayload(
55+
errorResponsePayload = new SecurityKnifeErrorResponsePayload(
5656
exception.getMessage(),
5757
"uri=" + request.getRequestURI(),
5858
iSecurityUserExceptionMessageService.getUserMessage(DefaultSecurityUserExceptionMessage.AUTHENTICATION_LOGIN_ERROR),

src/main/java/io/github/patternknife/securityhelper/oauth2/api/config/security/response/auth/authentication/DefaultAuthenticationFailureHandlerImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33

44
import io.github.patternknife.securityhelper.oauth2.api.config.logger.KnifeSecurityLogConfig;
5-
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.dto.ErrorResponsePayload;
5+
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.dto.SecurityKnifeErrorResponsePayload;
66
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.exception.KnifeOauth2AuthenticationException;
77
import io.github.patternknife.securityhelper.oauth2.api.config.security.response.error.util.ExceptionKnifeUtils;
88
import io.github.patternknife.securityhelper.oauth2.api.config.security.message.DefaultSecurityUserExceptionMessage;
@@ -32,19 +32,19 @@ public class DefaultAuthenticationFailureHandlerImpl implements AuthenticationFa
3232
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
3333
throws IOException {
3434

35-
ErrorResponsePayload errorResponsePayload;
35+
SecurityKnifeErrorResponsePayload errorResponsePayload;
3636
String stackTraces = ExceptionKnifeUtils.getAllStackTraces(exception);
3737
if(exception instanceof KnifeOauth2AuthenticationException){
38-
errorResponsePayload = new ErrorResponsePayload(((KnifeOauth2AuthenticationException) exception).getErrorMessages().getMessage(),
38+
errorResponsePayload = new SecurityKnifeErrorResponsePayload(((KnifeOauth2AuthenticationException) exception).getErrorMessages().getMessage(),
3939
"uri=" + request.getRequestURI(), ((KnifeOauth2AuthenticationException) exception).getErrorMessages().getUserMessage(), stackTraces);
4040
}else if(exception instanceof OAuth2AuthenticationException) {
41-
errorResponsePayload = new ErrorResponsePayload(
41+
errorResponsePayload = new SecurityKnifeErrorResponsePayload(
4242
((OAuth2AuthenticationException) exception).getError().getErrorCode() + " / " + ((OAuth2AuthenticationException) exception).getError().getDescription(),
4343
"uri=" + request.getRequestURI(),
4444
iSecurityUserExceptionMessageService.getUserMessage(DefaultSecurityUserExceptionMessage.AUTHENTICATION_LOGIN_FAILURE),
4545
stackTraces);
4646
}else{
47-
errorResponsePayload = new ErrorResponsePayload(
47+
errorResponsePayload = new SecurityKnifeErrorResponsePayload(
4848
exception.getMessage(),
4949
"uri=" + request.getRequestURI(),
5050
iSecurityUserExceptionMessageService.getUserMessage(DefaultSecurityUserExceptionMessage.AUTHENTICATION_LOGIN_ERROR),
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import java.util.Map;
1111

1212
@ToString
13-
public class ErrorResponsePayload {
13+
public class SecurityKnifeErrorResponsePayload {
1414
private Date timestamp;
1515

1616
// Never to be returned to clients, but must be logged.
@@ -26,7 +26,7 @@ public class ErrorResponsePayload {
2626
private String cause;
2727

2828

29-
public ErrorResponsePayload(ErrorMessages errorMessages, Exception e, String details, String stackTrace, String userMessage, Map<String, String> userValidationMessage) {
29+
public SecurityKnifeErrorResponsePayload(ErrorMessages errorMessages, Exception e, String details, String stackTrace, String userMessage, Map<String, String> userValidationMessage) {
3030
this.timestamp = TimestampUtil.getPayloadTimestamp();
3131
this.message = !StringUtils.isEmpty(errorMessages.getMessage()) ? errorMessages.getMessage() : e.getMessage() ;
3232
this.details = details;
@@ -35,15 +35,15 @@ public ErrorResponsePayload(ErrorMessages errorMessages, Exception e, String det
3535
this.userValidationMessage = errorMessages.getUserValidationMessage() != null && !errorMessages.getUserValidationMessage().isEmpty() ? errorMessages.getUserValidationMessage() : userValidationMessage;
3636
}
3737

38-
public ErrorResponsePayload(String message, String details, String userMessage, String stackTrace) {
38+
public SecurityKnifeErrorResponsePayload(String message, String details, String userMessage, String stackTrace) {
3939
this.timestamp = TimestampUtil.getPayloadTimestamp();
4040
this.message = message;
4141
this.details = details;
4242
this.userMessage = userMessage;
4343
this.stackTrace = stackTrace;
4444
}
4545

46-
public ErrorResponsePayload(String message, String details, String userMessage, String stackTrace, String cause) {
46+
public SecurityKnifeErrorResponsePayload(String message, String details, String userMessage, String stackTrace, String cause) {
4747
this.timestamp = TimestampUtil.getPayloadTimestamp();
4848
this.message = message;
4949
this.details = details;
@@ -52,8 +52,8 @@ public ErrorResponsePayload(String message, String details, String userMessage,
5252
this.cause = cause;
5353
}
5454

55-
public ErrorResponsePayload(String message, String details, String userMessage, Map<String, String> userValidationMessage,
56-
String stackTrace, String cause) {
55+
public SecurityKnifeErrorResponsePayload(String message, String details, String userMessage, Map<String, String> userValidationMessage,
56+
String stackTrace, String cause) {
5757

5858
this.timestamp = TimestampUtil.getPayloadTimestamp();
5959
this.message = message;

0 commit comments

Comments
 (0)