Improve @AuthenticationPrincipal meta-annotations

Closes gh-15286
This commit is contained in:
DingHao
2024-07-02 16:44:15 +08:00
committed by Josh Cummings
parent 6d657ea3da
commit 9aaf959400
8 changed files with 340 additions and 68 deletions

View File

@@ -27,7 +27,9 @@ 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.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;
@@ -167,6 +169,23 @@ public class AuthenticationPrincipalArgumentResolverTests {
assertThat(this.resolver.resolveArgument(showUserAnnotationObject(), null)).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)).isEqualTo(principal.id);
}
@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)).isEqualTo(principal.id);
}
private MethodParameter showUserNoAnnotation() {
return getMethodParameter("showUserNoAnnotation", String.class);
}
@@ -195,6 +214,14 @@ public class AuthenticationPrincipalArgumentResolverTests {
return getMethodParameter("showUserCustomAnnotation", CustomUserPrincipal.class);
}
private MethodParameter showUserCustomMetaAnnotation() {
return getMethodParameter("showUserCustomMetaAnnotation", int.class);
}
private MethodParameter showUserCustomMetaAnnotationTpl() {
return getMethodParameter("showUserCustomMetaAnnotationTpl", int.class);
}
private MethodParameter showUserSpel() {
return getMethodParameter("showUserSpel", String.class);
}
@@ -236,6 +263,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) {
@@ -260,6 +304,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) {
}
@@ -281,6 +331,10 @@ public class AuthenticationPrincipalArgumentResolverTests {
public final int id = 1;
public Object getPrincipal() {
return this;
}
}
public static class CopyUserPrincipal {

View File

@@ -23,10 +23,12 @@ import org.junit.jupiter.api.Test;
import reactor.core.publisher.Mono;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AliasFor;
import org.springframework.core.annotation.SynthesizingMethodParameter;
import org.springframework.security.authentication.TestAuthentication;
import org.springframework.security.authentication.TestingAuthenticationToken;
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.core.userdetails.UserDetails;
@@ -141,10 +143,56 @@ public class AuthenticationPrincipalArgumentResolverTests {
}
@Test
public void resolveArgumentCustomMetaAnnotation() {
CustomUserPrincipal principal = new CustomUserPrincipal();
Mono<Object> result = this.resolver.resolveArgument(arg0("showUserCustomMetaAnnotation"), null)
.contextWrite(ReactiveSecurityContextHolder
.withAuthentication(new TestingAuthenticationToken(principal, "password", "ROLE_USER")));
assertThat(result.block()).isEqualTo(principal.id);
}
@Test
public void resolveArgumentCustomMetaAnnotationTpl() {
CustomUserPrincipal principal = new CustomUserPrincipal();
this.resolver.setTemplateDefaults(new AnnotationTemplateExpressionDefaults());
Mono<Object> result = this.resolver.resolveArgument(arg0("showUserCustomMetaAnnotationTpl"), null)
.contextWrite(ReactiveSecurityContextHolder
.withAuthentication(new TestingAuthenticationToken(principal, "password", "ROLE_USER")));
assertThat(result.block()).isEqualTo(principal.id);
}
public void showUserCustomMetaAnnotation(@CurrentUser2(expression = "principal.id") int userId) {
}
public void showUserCustomMetaAnnotationTpl(@CurrentUser3(property = "id") int userId) {
}
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 "";
}
}