Skip to content

Commit 518bc75

Browse files
committed
Use SecurityContextHolderStrategy for Data
Issue gh-11060
1 parent f3d99f5 commit 518bc75

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

data/src/main/java/org/springframework/security/data/repository/query/SecurityEvaluationContextExtension.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.security.core.Authentication;
2828
import org.springframework.security.core.context.SecurityContext;
2929
import org.springframework.security.core.context.SecurityContextHolder;
30+
import org.springframework.security.core.context.SecurityContextHolderStrategy;
3031
import org.springframework.util.Assert;
3132

3233
/**
@@ -89,6 +90,9 @@
8990
*/
9091
public class SecurityEvaluationContextExtension implements EvaluationContextExtension {
9192

93+
private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder
94+
.getContextHolderStrategy();
95+
9296
private Authentication authentication;
9397

9498
private AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl();
@@ -131,11 +135,22 @@ public SecurityExpressionRoot getRootObject() {
131135
return root;
132136
}
133137

138+
/**
139+
* Sets the {@link SecurityContextHolderStrategy} to use. The default action is to use
140+
* the {@link SecurityContextHolderStrategy} stored in {@link SecurityContextHolder}.
141+
*
142+
* @since 5.8
143+
*/
144+
public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy) {
145+
Assert.notNull(securityContextHolderStrategy, "securityContextHolderStrategy cannot be null");
146+
this.securityContextHolderStrategy = securityContextHolderStrategy;
147+
}
148+
134149
private Authentication getAuthentication() {
135150
if (this.authentication != null) {
136151
return this.authentication;
137152
}
138-
SecurityContext context = SecurityContextHolder.getContext();
153+
SecurityContext context = this.securityContextHolderStrategy.getContext();
139154
return context.getAuthentication();
140155
}
141156

data/src/test/java/org/springframework/security/data/repository/query/SecurityEvaluationContextExtensionTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,14 @@
2929
import org.springframework.security.authentication.AuthenticationTrustResolverImpl;
3030
import org.springframework.security.authentication.TestingAuthenticationToken;
3131
import org.springframework.security.core.context.SecurityContextHolder;
32+
import org.springframework.security.core.context.SecurityContextHolderStrategy;
33+
import org.springframework.security.core.context.SecurityContextImpl;
3234

3335
import static org.assertj.core.api.Assertions.assertThat;
3436
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
37+
import static org.mockito.BDDMockito.given;
38+
import static org.mockito.Mockito.mock;
39+
import static org.mockito.Mockito.verify;
3540

3641
public class SecurityEvaluationContextExtensionTests {
3742

@@ -59,6 +64,16 @@ public void getRootObjectSecurityContextHolderAuthentication() {
5964
assertThat(getRoot().getAuthentication()).isSameAs(authentication);
6065
}
6166

67+
@Test
68+
public void getRootObjectUseSecurityContextHolderStrategy() {
69+
TestingAuthenticationToken authentication = new TestingAuthenticationToken("user", "password", "ROLE_USER");
70+
SecurityContextHolderStrategy strategy = mock(SecurityContextHolderStrategy.class);
71+
given(strategy.getContext()).willReturn(new SecurityContextImpl(authentication));
72+
this.securityExtension.setSecurityContextHolderStrategy(strategy);
73+
assertThat(getRoot().getAuthentication()).isSameAs(authentication);
74+
verify(strategy).getContext();
75+
}
76+
6277
@Test
6378
public void getRootObjectExplicitAuthenticationOverridesSecurityContextHolder() {
6479
TestingAuthenticationToken explicit = new TestingAuthenticationToken("explicit", "password", "ROLE_EXPLICIT");

0 commit comments

Comments
 (0)