Improve @AuthenticationPrincipal meta-annotations
Closes gh-15286
This commit is contained in:
@@ -27,8 +27,10 @@ import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.core.annotation.AliasFor;
|
||||
import org.springframework.expression.BeanResolver;
|
||||
import org.springframework.security.authentication.TestingAuthenticationToken;
|
||||
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.security.core.authority.AuthorityUtils;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
@@ -193,6 +195,25 @@ public class AuthenticationPrincipalArgumentResolverTests {
|
||||
.isEqualTo(this.expectedPrincipal);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveArgumentCustomMetaAnnotation() throws Exception {
|
||||
CustomUserPrincipal principal = new CustomUserPrincipal();
|
||||
setAuthenticationPrincipal(principal);
|
||||
this.expectedPrincipal = principal.id;
|
||||
assertThat(this.resolver.resolveArgument(showUserCustomMetaAnnotation(), null, null, null))
|
||||
.isEqualTo(this.expectedPrincipal);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveArgumentCustomMetaAnnotationTpl() throws Exception {
|
||||
CustomUserPrincipal principal = new CustomUserPrincipal();
|
||||
setAuthenticationPrincipal(principal);
|
||||
this.resolver.setTemplateDefaults(new AnnotationTemplateExpressionDefaults());
|
||||
this.expectedPrincipal = principal.id;
|
||||
assertThat(this.resolver.resolveArgument(showUserCustomMetaAnnotationTpl(), null, null, null))
|
||||
.isEqualTo(this.expectedPrincipal);
|
||||
}
|
||||
|
||||
private MethodParameter showUserNoAnnotation() {
|
||||
return getMethodParameter("showUserNoAnnotation", String.class);
|
||||
}
|
||||
@@ -241,6 +262,14 @@ public class AuthenticationPrincipalArgumentResolverTests {
|
||||
return getMethodParameter("showUserAnnotation", Object.class);
|
||||
}
|
||||
|
||||
private MethodParameter showUserCustomMetaAnnotation() {
|
||||
return getMethodParameter("showUserCustomMetaAnnotation", int.class);
|
||||
}
|
||||
|
||||
private MethodParameter showUserCustomMetaAnnotationTpl() {
|
||||
return getMethodParameter("showUserCustomMetaAnnotationTpl", int.class);
|
||||
}
|
||||
|
||||
private MethodParameter getMethodParameter(String methodName, Class<?>... paramTypes) {
|
||||
Method method = ReflectionUtils.findMethod(TestController.class, methodName, paramTypes);
|
||||
return new MethodParameter(method, 0);
|
||||
@@ -266,6 +295,23 @@ public class AuthenticationPrincipalArgumentResolverTests {
|
||||
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@AuthenticationPrincipal
|
||||
public @interface CurrentUser2 {
|
||||
|
||||
@AliasFor(annotation = AuthenticationPrincipal.class)
|
||||
String expression() default "";
|
||||
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@AuthenticationPrincipal(expression = "principal.{property}")
|
||||
public @interface CurrentUser3 {
|
||||
|
||||
String property() default "";
|
||||
|
||||
}
|
||||
|
||||
public static class TestController {
|
||||
|
||||
public void showUserNoAnnotation(String user) {
|
||||
@@ -290,6 +336,12 @@ public class AuthenticationPrincipalArgumentResolverTests {
|
||||
public void showUserCustomAnnotation(@CurrentUser CustomUserPrincipal user) {
|
||||
}
|
||||
|
||||
public void showUserCustomMetaAnnotation(@CurrentUser2(expression = "principal.id") int userId) {
|
||||
}
|
||||
|
||||
public void showUserCustomMetaAnnotationTpl(@CurrentUser3(property = "id") int userId) {
|
||||
}
|
||||
|
||||
public void showUserAnnotation(@AuthenticationPrincipal Object user) {
|
||||
}
|
||||
|
||||
@@ -314,6 +366,10 @@ public class AuthenticationPrincipalArgumentResolverTests {
|
||||
|
||||
public final int id = 1;
|
||||
|
||||
public Object getPrincipal() {
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class CopyUserPrincipal {
|
||||
|
||||
@@ -31,8 +31,11 @@ import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.core.ReactiveAdapterRegistry;
|
||||
import org.springframework.core.annotation.AliasFor;
|
||||
import org.springframework.core.annotation.SynthesizingMethodParameter;
|
||||
import org.springframework.expression.BeanResolver;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
|
||||
import org.springframework.security.web.method.ResolvableMethod;
|
||||
@@ -206,6 +209,38 @@ public class AuthenticationPrincipalArgumentResolverTests {
|
||||
assertThatExceptionOfType(ClassCastException.class).isThrownBy(() -> argument.block());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveArgumentCustomMetaAnnotation() {
|
||||
CustomUserPrincipal principal = new CustomUserPrincipal();
|
||||
given(this.authentication.getPrincipal()).willReturn(principal);
|
||||
Mono<Object> result = this.resolver
|
||||
.resolveArgument(arg0("showUserCustomMetaAnnotation"), this.bindingContext, this.exchange)
|
||||
.contextWrite(ReactiveSecurityContextHolder.withAuthentication(this.authentication));
|
||||
assertThat(result.block()).isEqualTo(principal.id);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveArgumentCustomMetaAnnotationTpl() {
|
||||
CustomUserPrincipal principal = new CustomUserPrincipal();
|
||||
given(this.authentication.getPrincipal()).willReturn(principal);
|
||||
this.resolver.setTemplateDefaults(new AnnotationTemplateExpressionDefaults());
|
||||
Mono<Object> result = this.resolver
|
||||
.resolveArgument(arg0("showUserCustomMetaAnnotationTpl"), this.bindingContext, this.exchange)
|
||||
.contextWrite(ReactiveSecurityContextHolder.withAuthentication(this.authentication));
|
||||
assertThat(result.block()).isEqualTo(principal.id);
|
||||
}
|
||||
|
||||
private MethodParameter arg0(String methodName) {
|
||||
ResolvableMethod method = ResolvableMethod.on(getClass()).named(methodName).build();
|
||||
return new SynthesizingMethodParameter(method.method(), 0);
|
||||
}
|
||||
|
||||
public void showUserCustomMetaAnnotation(@CurrentUser2(expression = "principal.id") int userId) {
|
||||
}
|
||||
|
||||
public void showUserCustomMetaAnnotationTpl(@CurrentUser3(property = "id") int userId) {
|
||||
}
|
||||
|
||||
void authenticationPrincipal(@AuthenticationPrincipal String principal,
|
||||
@AuthenticationPrincipal Mono<String> monoPrincipal) {
|
||||
}
|
||||
@@ -278,4 +313,31 @@ public class AuthenticationPrincipalArgumentResolverTests {
|
||||
|
||||
}
|
||||
|
||||
static class CustomUserPrincipal {
|
||||
|
||||
public final int id = 1;
|
||||
|
||||
public Object getPrincipal() {
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@AuthenticationPrincipal
|
||||
public @interface CurrentUser2 {
|
||||
|
||||
@AliasFor(annotation = AuthenticationPrincipal.class)
|
||||
String expression() default "";
|
||||
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@AuthenticationPrincipal(expression = "principal.{property}")
|
||||
public @interface CurrentUser3 {
|
||||
|
||||
String property() default "";
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user