Skip to content

Commit e30d780

Browse files
happier233jzheaux
authored andcommitted
Configure CurrentSecurityContextArgumentResolver BeanResolver
Closes gh-9331
1 parent fc24c79 commit e30d780

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m
9898
StandardEvaluationContext context = new StandardEvaluationContext();
9999
context.setRootObject(securityContext);
100100
context.setVariable("this", securityContext);
101+
context.setBeanResolver(this.beanResolver);
101102
Expression expression = this.parser.parseExpression(expressionToParse);
102103
securityContextResult = expression.getValue(context);
103104
}

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@
2121
import java.lang.annotation.RetentionPolicy;
2222
import java.lang.annotation.Target;
2323
import java.lang.reflect.Method;
24+
import java.util.function.Function;
2425

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

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;
@@ -44,13 +47,21 @@
4447
*/
4548
public class AuthenticationPrincipalArgumentResolverTests {
4649

50+
private final BeanResolver beanResolver = ((context, beanName) -> {
51+
if (!"test".equals(beanName)) {
52+
throw new AccessException("Could not resolve bean reference against BeanFactory");
53+
}
54+
return (Function<CustomUserPrincipal, String>) (principal) -> principal.property;
55+
});
56+
4757
private Object expectedPrincipal;
4858

4959
private AuthenticationPrincipalArgumentResolver resolver;
5060

5161
@Before
5262
public void setup() {
5363
this.resolver = new AuthenticationPrincipalArgumentResolver();
64+
this.resolver.setBeanResolver(this.beanResolver);
5465
}
5566

5667
@After
@@ -127,6 +138,14 @@ public void resolveArgumentSpel() throws Exception {
127138
assertThat(this.resolver.resolveArgument(showUserSpel(), null, null, null)).isEqualTo(this.expectedPrincipal);
128139
}
129140

141+
@Test
142+
public void resolveArgumentSpelBean() throws Exception {
143+
CustomUserPrincipal principal = new CustomUserPrincipal();
144+
setAuthenticationPrincipal(principal);
145+
this.expectedPrincipal = principal.property;
146+
assertThat(this.resolver.resolveArgument(showUserSpelBean(), null, null, null)).isEqualTo(this.expectedPrincipal);
147+
}
148+
130149
@Test
131150
public void resolveArgumentSpelCopy() throws Exception {
132151
CopyUserPrincipal principal = new CopyUserPrincipal("property");
@@ -195,6 +214,10 @@ private MethodParameter showUserSpel() {
195214
return getMethodParameter("showUserSpel", String.class);
196215
}
197216

217+
private MethodParameter showUserSpelBean() {
218+
return getMethodParameter("showUserSpelBean", String.class);
219+
}
220+
198221
private MethodParameter showUserSpelCopy() {
199222
return getMethodParameter("showUserSpelCopy", CopyUserPrincipal.class);
200223
}
@@ -258,6 +281,10 @@ public void showUserAnnotation(@AuthenticationPrincipal Object user) {
258281
public void showUserSpel(@AuthenticationPrincipal(expression = "property") String user) {
259282
}
260283

284+
public void showUserSpelBean(@AuthenticationPrincipal(
285+
expression = "@test.apply(#this)") String user) {
286+
}
287+
261288
public void showUserSpelCopy(@AuthenticationPrincipal(
262289
expression = "new org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolverTests$CopyUserPrincipal(#this)") CopyUserPrincipal user) {
263290
}

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@
2121
import java.lang.annotation.RetentionPolicy;
2222
import java.lang.annotation.Target;
2323
import java.lang.reflect.Method;
24+
import java.util.function.Function;
2425

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

2930
import org.springframework.core.MethodParameter;
31+
import org.springframework.expression.AccessException;
32+
import org.springframework.expression.BeanResolver;
3033
import org.springframework.expression.spel.SpelEvaluationException;
3134
import org.springframework.security.authentication.TestingAuthenticationToken;
3235
import org.springframework.security.core.Authentication;
@@ -47,11 +50,19 @@
4750
*/
4851
public class CurrentSecurityContextArgumentResolverTests {
4952

53+
private final BeanResolver beanResolver = ((context, beanName) -> {
54+
if (!"test".equals(beanName)) {
55+
throw new AccessException("Could not resolve bean reference against BeanFactory");
56+
}
57+
return (Function<SecurityContext, Authentication>) SecurityContext::getAuthentication;
58+
});
59+
5060
private CurrentSecurityContextArgumentResolver resolver;
5161

5262
@Before
5363
public void setup() {
5464
this.resolver = new CurrentSecurityContextArgumentResolver();
65+
this.resolver.setBeanResolver(this.beanResolver);
5566
}
5667

5768
@After
@@ -106,6 +117,15 @@ public void resolveArgumentWithAuthentication() {
106117
assertThat(auth1.getPrincipal()).isEqualTo(principal);
107118
}
108119

120+
@Test
121+
public void resolveArgumentWithAuthenticationWithBean() {
122+
String principal = "john";
123+
setAuthenticationPrincipal(principal);
124+
Authentication auth1 = (Authentication) this.resolver
125+
.resolveArgument(showSecurityContextAuthenticationWithBean(), null, null, null);
126+
assertThat(auth1.getPrincipal()).isEqualTo(principal);
127+
}
128+
109129
@Test
110130
public void resolveArgumentWithNullAuthentication() {
111131
SecurityContext context = SecurityContextHolder.getContext();
@@ -213,6 +233,10 @@ private MethodParameter showSecurityContextAuthenticationAnnotation() {
213233
return getMethodParameter("showSecurityContextAuthenticationAnnotation", Authentication.class);
214234
}
215235

236+
public MethodParameter showSecurityContextAuthenticationWithBean() {
237+
return getMethodParameter("showSecurityContextAuthenticationWithBean", Authentication.class);
238+
}
239+
216240
private MethodParameter showSecurityContextAuthenticationWithOptionalPrincipal() {
217241
return getMethodParameter("showSecurityContextAuthenticationWithOptionalPrincipal", Object.class);
218242
}
@@ -294,6 +318,10 @@ public void showSecurityContextAuthenticationAnnotation(
294318
@CurrentSecurityContext(expression = "authentication") Authentication authentication) {
295319
}
296320

321+
public void showSecurityContextAuthenticationWithBean(
322+
@CurrentSecurityContext(expression = "@test.apply(#this)") Authentication authentication) {
323+
}
324+
297325
public void showSecurityContextAuthenticationWithOptionalPrincipal(
298326
@CurrentSecurityContext(expression = "authentication?.principal") Object principal) {
299327
}

0 commit comments

Comments
 (0)