diff --git a/nrich-encrypt-api/src/main/java/net/croz/nrich/encrypt/api/model/EncryptionContext.java b/nrich-encrypt-api/src/main/java/net/croz/nrich/encrypt/api/model/EncryptionContext.java index 0a6694a06..bf2273649 100644 --- a/nrich-encrypt-api/src/main/java/net/croz/nrich/encrypt/api/model/EncryptionContext.java +++ b/nrich-encrypt-api/src/main/java/net/croz/nrich/encrypt/api/model/EncryptionContext.java @@ -44,4 +44,9 @@ public class EncryptionContext { */ private final List methodDecryptedArguments; + /** + * Current username or null if none exist + */ + private final String currentUsername; + } diff --git a/nrich-encrypt/src/main/java/net/croz/nrich/encrypt/aspect/EncryptDataAspect.java b/nrich-encrypt/src/main/java/net/croz/nrich/encrypt/aspect/EncryptDataAspect.java index 51f451487..557f9009a 100644 --- a/nrich-encrypt/src/main/java/net/croz/nrich/encrypt/aspect/EncryptDataAspect.java +++ b/nrich-encrypt/src/main/java/net/croz/nrich/encrypt/aspect/EncryptDataAspect.java @@ -28,10 +28,14 @@ import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; import java.lang.annotation.Annotation; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.stream.IntStream; @RequiredArgsConstructor @@ -98,11 +102,20 @@ private DecryptArgument decryptArgumentAnnotation(Annotation[] annotationList) { private EncryptionContext createEncryptionContext(Signature signature, Object[] arguments) { List argumentList = Arrays.asList(arguments); String methodName = String.format(EncryptConstants.METHOD_NAME_FORMAT, signature.getDeclaringType().getName(), signature.getName()); + String currentUsername = currentUsername(); return EncryptionContext.builder() .fullyQualifiedMethodName(methodName) .methodArguments(argumentList) .methodDecryptedArguments(argumentList) + .currentUsername(currentUsername) .build(); } + + private String currentUsername() { + return Optional.ofNullable(SecurityContextHolder.getContext()) + .map(SecurityContext::getAuthentication) + .map(Authentication::getName) + .orElse(null); + } } diff --git a/nrich-encrypt/src/main/java/net/croz/nrich/encrypt/aspect/EncryptMethodInterceptor.java b/nrich-encrypt/src/main/java/net/croz/nrich/encrypt/aspect/EncryptMethodInterceptor.java index f03c04f72..2faafc8b0 100644 --- a/nrich-encrypt/src/main/java/net/croz/nrich/encrypt/aspect/EncryptMethodInterceptor.java +++ b/nrich-encrypt/src/main/java/net/croz/nrich/encrypt/aspect/EncryptMethodInterceptor.java @@ -27,6 +27,9 @@ import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.ProxyMethodInvocation; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; import java.util.Arrays; import java.util.Collections; @@ -114,11 +117,20 @@ private EncryptionConfiguration findEncryptionConfigurationForOperation(List argumentList = Arrays.asList(arguments); + String currentUsername = currentUsername(); return EncryptionContext.builder() .fullyQualifiedMethodName(methodName) .methodArguments(argumentList) .methodDecryptedArguments(argumentList) + .currentUsername(currentUsername) .build(); } + + private String currentUsername() { + return Optional.ofNullable(SecurityContextHolder.getContext()) + .map(SecurityContext::getAuthentication) + .map(Authentication::getName) + .orElse(null); + } }