Skip to content

Commit 7a5c34c

Browse files
happier233jzheaux
authored andcommitted
Configure CurrentSecurityContextArgumentResolver BeanResolver
Closes gh-9331
1 parent 542c625 commit 7a5c34c

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

web/src/main/java/org/springframework/security/web/method/annotation/CurrentSecurityContextArgumentResolver.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public Object resolveArgument(MethodParameter parameter,
108108
StandardEvaluationContext context = new StandardEvaluationContext();
109109
context.setRootObject(securityContext);
110110
context.setVariable("this", securityContext);
111-
111+
context.setBeanResolver(this.beanResolver);
112112
Expression expression = this.parser.parseExpression(expressionToParse);
113113
securityContextResult = expression.getValue(context);
114114
}

web/src/test/java/org/springframework/security/web/method/annotation/AuthenticationPrincipalArgumentResolverTests.java

+28
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@
2222
import java.lang.annotation.RetentionPolicy;
2323
import java.lang.annotation.Target;
2424
import java.lang.reflect.Method;
25+
import java.util.function.Function;
2526

2627
import org.junit.After;
2728
import org.junit.Before;
2829
import org.junit.Test;
2930
import org.springframework.core.MethodParameter;
31+
import org.springframework.expression.AccessException;
32+
import org.springframework.expression.BeanResolver;
3033
import org.springframework.security.authentication.TestingAuthenticationToken;
3134
import org.springframework.security.core.annotation.AuthenticationPrincipal;
3235
import org.springframework.security.core.authority.AuthorityUtils;
@@ -40,12 +43,21 @@
4043
*
4144
*/
4245
public class AuthenticationPrincipalArgumentResolverTests {
46+
47+
private final BeanResolver beanResolver = ((context, beanName) -> {
48+
if (!"test".equals(beanName)) {
49+
throw new AccessException("Could not resolve bean reference against BeanFactory");
50+
}
51+
return (Function<CustomUserPrincipal, String>) (principal) -> principal.property;
52+
});
53+
4354
private Object expectedPrincipal;
4455
private AuthenticationPrincipalArgumentResolver resolver;
4556

4657
@Before
4758
public void setup() {
4859
resolver = new AuthenticationPrincipalArgumentResolver();
60+
resolver.setBeanResolver(this.beanResolver);
4961
}
5062

5163
@After
@@ -128,6 +140,14 @@ public void resolveArgumentSpel() throws Exception {
128140
.isEqualTo(this.expectedPrincipal);
129141
}
130142

143+
@Test
144+
public void resolveArgumentSpelBean() throws Exception {
145+
CustomUserPrincipal principal = new CustomUserPrincipal();
146+
setAuthenticationPrincipal(principal);
147+
this.expectedPrincipal = principal.property;
148+
assertThat(this.resolver.resolveArgument(showUserSpelBean(), null, null, null)).isEqualTo(this.expectedPrincipal);
149+
}
150+
131151
@Test
132152
public void resolveArgumentSpelCopy() throws Exception {
133153
CopyUserPrincipal principal = new CopyUserPrincipal("property");
@@ -198,6 +218,10 @@ private MethodParameter showUserSpel() {
198218
return getMethodParameter("showUserSpel", String.class);
199219
}
200220

221+
private MethodParameter showUserSpelBean() {
222+
return getMethodParameter("showUserSpelBean", String.class);
223+
}
224+
201225
private MethodParameter showUserSpelCopy() {
202226
return getMethodParameter("showUserSpelCopy", CopyUserPrincipal.class);
203227
}
@@ -255,6 +279,10 @@ public void showUserSpel(
255279
@AuthenticationPrincipal(expression = "property") String user) {
256280
}
257281

282+
public void showUserSpelBean(@AuthenticationPrincipal(
283+
expression = "@test.apply(#this)") String user) {
284+
}
285+
258286
public void showUserSpelCopy(
259287
@AuthenticationPrincipal(expression = "new org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolverTests$CopyUserPrincipal(#this)") CopyUserPrincipal user) {
260288
}

web/src/test/java/org/springframework/security/web/method/annotation/CurrentSecurityContextArgumentResolverTests.java

+29
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@
2020
import java.lang.annotation.RetentionPolicy;
2121
import java.lang.annotation.Target;
2222
import java.lang.reflect.Method;
23+
import java.util.function.Function;
2324

2425
import org.junit.After;
2526
import org.junit.Before;
2627
import org.junit.Test;
2728

2829
import org.springframework.core.MethodParameter;
30+
import org.springframework.expression.AccessException;
31+
import org.springframework.expression.BeanResolver;
2932
import org.springframework.expression.spel.SpelEvaluationException;
3033
import org.springframework.security.authentication.TestingAuthenticationToken;
3134
import org.springframework.security.core.Authentication;
@@ -45,11 +48,20 @@
4548
*
4649
*/
4750
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+
4859
private CurrentSecurityContextArgumentResolver resolver;
4960

5061
@Before
5162
public void setup() {
5263
this.resolver = new CurrentSecurityContextArgumentResolver();
64+
this.resolver.setBeanResolver(this.beanResolver);
5365
}
5466

5567
@After
@@ -104,6 +116,15 @@ public void resolveArgumentWithAuthentication() {
104116
assertThat(auth1.getPrincipal()).isEqualTo(principal);
105117
}
106118

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+
107128
@Test
108129
public void resolveArgumentWithNullAuthentication() {
109130
SecurityContext context = SecurityContextHolder.getContext();
@@ -217,6 +238,10 @@ private MethodParameter showSecurityContextAuthenticationAnnotation() {
217238
return getMethodParameter("showSecurityContextAuthenticationAnnotation", Authentication.class);
218239
}
219240

241+
public MethodParameter showSecurityContextAuthenticationWithBean() {
242+
return getMethodParameter("showSecurityContextAuthenticationWithBean", Authentication.class);
243+
}
244+
220245
private MethodParameter showSecurityContextAuthenticationWithOptionalPrincipal() {
221246
return getMethodParameter("showSecurityContextAuthenticationWithOptionalPrincipal", Object.class);
222247
}
@@ -279,6 +304,10 @@ public void showAnnotationWithCustomSecurityContextTypeMatch(@CurrentSecurityCon
279304
public void showSecurityContextAuthenticationAnnotation(@CurrentSecurityContext(expression = "authentication") Authentication authentication) {
280305
}
281306

307+
public void showSecurityContextAuthenticationWithBean(
308+
@CurrentSecurityContext(expression = "@test.apply(#this)") Authentication authentication) {
309+
}
310+
282311
public void showSecurityContextAuthenticationWithOptionalPrincipal(@CurrentSecurityContext(expression = "authentication?.principal") Object principal) {
283312
}
284313

0 commit comments

Comments
 (0)