|
20 | 20 | import java.lang.annotation.RetentionPolicy;
|
21 | 21 | import java.lang.annotation.Target;
|
22 | 22 | import java.lang.reflect.Method;
|
| 23 | +import java.util.function.Function; |
23 | 24 |
|
24 | 25 | import org.junit.After;
|
25 | 26 | import org.junit.Before;
|
26 | 27 | import org.junit.Test;
|
27 | 28 |
|
28 | 29 | import org.springframework.core.MethodParameter;
|
| 30 | +import org.springframework.expression.AccessException; |
| 31 | +import org.springframework.expression.BeanResolver; |
29 | 32 | import org.springframework.expression.spel.SpelEvaluationException;
|
30 | 33 | import org.springframework.security.authentication.TestingAuthenticationToken;
|
31 | 34 | import org.springframework.security.core.Authentication;
|
|
45 | 48 | *
|
46 | 49 | */
|
47 | 50 | public class CurrentSecurityContextArgumentResolverTests {
|
| 51 | + |
| 52 | + private final BeanResolver beanResolver = ((context, beanName) -> { |
| 53 | + if (!"test".equals(beanName)) { |
| 54 | + throw new AccessException("Could not resolve bean reference against BeanFactory"); |
| 55 | + } |
| 56 | + return (Function<SecurityContext, Authentication>) SecurityContext::getAuthentication; |
| 57 | + }); |
| 58 | + |
48 | 59 | private CurrentSecurityContextArgumentResolver resolver;
|
49 | 60 |
|
50 | 61 | @Before
|
51 | 62 | public void setup() {
|
52 | 63 | this.resolver = new CurrentSecurityContextArgumentResolver();
|
| 64 | + this.resolver.setBeanResolver(this.beanResolver); |
53 | 65 | }
|
54 | 66 |
|
55 | 67 | @After
|
@@ -104,6 +116,15 @@ public void resolveArgumentWithAuthentication() {
|
104 | 116 | assertThat(auth1.getPrincipal()).isEqualTo(principal);
|
105 | 117 | }
|
106 | 118 |
|
| 119 | + @Test |
| 120 | + public void resolveArgumentWithAuthenticationWithBean() { |
| 121 | + String principal = "john"; |
| 122 | + setAuthenticationPrincipal(principal); |
| 123 | + Authentication auth1 = (Authentication) this.resolver |
| 124 | + .resolveArgument(showSecurityContextAuthenticationWithBean(), null, null, null); |
| 125 | + assertThat(auth1.getPrincipal()).isEqualTo(principal); |
| 126 | + } |
| 127 | + |
107 | 128 | @Test
|
108 | 129 | public void resolveArgumentWithNullAuthentication() {
|
109 | 130 | SecurityContext context = SecurityContextHolder.getContext();
|
@@ -217,6 +238,10 @@ private MethodParameter showSecurityContextAuthenticationAnnotation() {
|
217 | 238 | return getMethodParameter("showSecurityContextAuthenticationAnnotation", Authentication.class);
|
218 | 239 | }
|
219 | 240 |
|
| 241 | + public MethodParameter showSecurityContextAuthenticationWithBean() { |
| 242 | + return getMethodParameter("showSecurityContextAuthenticationWithBean", Authentication.class); |
| 243 | + } |
| 244 | + |
220 | 245 | private MethodParameter showSecurityContextAuthenticationWithOptionalPrincipal() {
|
221 | 246 | return getMethodParameter("showSecurityContextAuthenticationWithOptionalPrincipal", Object.class);
|
222 | 247 | }
|
@@ -279,6 +304,10 @@ public void showAnnotationWithCustomSecurityContextTypeMatch(@CurrentSecurityCon
|
279 | 304 | public void showSecurityContextAuthenticationAnnotation(@CurrentSecurityContext(expression = "authentication") Authentication authentication) {
|
280 | 305 | }
|
281 | 306 |
|
| 307 | + public void showSecurityContextAuthenticationWithBean( |
| 308 | + @CurrentSecurityContext(expression = "@test.apply(#this)") Authentication authentication) { |
| 309 | + } |
| 310 | + |
282 | 311 | public void showSecurityContextAuthenticationWithOptionalPrincipal(@CurrentSecurityContext(expression = "authentication?.principal") Object principal) {
|
283 | 312 | }
|
284 | 313 |
|
|
0 commit comments