@ -50,19 +50,24 @@ import org.springframework.security.authorization.AuthorizationManager;
@@ -50,19 +50,24 @@ import org.springframework.security.authorization.AuthorizationManager;
import org.springframework.security.authorization.method.AuthorizationInterceptorsOrder ;
import org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor ;
import org.springframework.security.authorization.method.MethodInvocationResult ;
import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig ;
import org.springframework.security.config.core.GrantedAuthorityDefaults ;
import org.springframework.security.config.test.SpringTestContext ;
import org.springframework.security.config.test.SpringTestContextExtension ;
import org.springframework.security.config.test.SpringTestParentApplicationContextExecutionListener ;
import org.springframework.security.core.Authentication ;
import org.springframework.security.core.context.SecurityContextHolder ;
import org.springframework.security.test.context.annotation.SecurityTestExecutionListeners ;
import org.springframework.security.core.context.SecurityContextHolderStrategy ;
import org.springframework.security.test.context.support.WithAnonymousUser ;
import org.springframework.security.test.context.support.WithMockUser ;
import org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener ;
import org.springframework.test.context.ContextConfiguration ;
import org.springframework.test.context.TestExecutionListeners ;
import org.springframework.test.context.junit.jupiter.SpringExtension ;
import static org.assertj.core.api.Assertions.assertThat ;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType ;
import static org.mockito.ArgumentMatchers.any ;
import static org.mockito.Mockito.atLeastOnce ;
import static org.mockito.Mockito.mock ;
import static org.mockito.Mockito.verify ;
@ -73,7 +78,9 @@ import static org.mockito.Mockito.verify;
@@ -73,7 +78,9 @@ import static org.mockito.Mockito.verify;
* @author Josh Cummings
* /
@ExtendWith ( { SpringExtension . class , SpringTestContextExtension . class } )
@SecurityTestExecutionListeners
@ContextConfiguration ( classes = SecurityContextChangedListenerConfig . class )
@TestExecutionListeners ( listeners = { WithSecurityContextTestExecutionListener . class ,
SpringTestParentApplicationContextExecutionListener . class } )
public class PrePostMethodSecurityConfigurationTests {
public final SpringTestContext spring = new SpringTestContext ( this ) ;
@ -137,6 +144,8 @@ public class PrePostMethodSecurityConfigurationTests {
@@ -137,6 +144,8 @@ public class PrePostMethodSecurityConfigurationTests {
this . spring . register ( MethodSecurityServiceEnabledConfig . class ) . autowire ( ) ;
assertThatExceptionOfType ( AccessDeniedException . class ) . isThrownBy ( this . methodSecurityService : : securedUser )
. withMessage ( "Access Denied" ) ;
SecurityContextHolderStrategy strategy = this . spring . getContext ( ) . getBean ( SecurityContextHolderStrategy . class ) ;
verify ( strategy , atLeastOnce ( ) ) . getContext ( ) ;
}
@WithMockUser
@ -162,6 +171,15 @@ public class PrePostMethodSecurityConfigurationTests {
@@ -162,6 +171,15 @@ public class PrePostMethodSecurityConfigurationTests {
this . methodSecurityService . preAuthorizeAdmin ( ) ;
}
@WithMockUser ( roles = "ADMIN" )
@Test
public void preAuthorizeAdminWhenSecurityContextHolderStrategyThenUses ( ) {
this . spring . register ( MethodSecurityServiceConfig . class ) . autowire ( ) ;
this . methodSecurityService . preAuthorizeAdmin ( ) ;
SecurityContextHolderStrategy strategy = this . spring . getContext ( ) . getBean ( SecurityContextHolderStrategy . class ) ;
verify ( strategy , atLeastOnce ( ) ) . getContext ( ) ;
}
@WithMockUser ( authorities = "PREFIX_ADMIN" )
@Test
public void preAuthorizeAdminWhenRoleAdminAndCustomPrefixThenPasses ( ) {
@ -285,6 +303,8 @@ public class PrePostMethodSecurityConfigurationTests {
@@ -285,6 +303,8 @@ public class PrePostMethodSecurityConfigurationTests {
this . spring . register ( BusinessServiceConfig . class ) . autowire ( ) ;
assertThatExceptionOfType ( AccessDeniedException . class ) . isThrownBy ( this . businessService : : rolesAllowedUser )
. withMessage ( "Access Denied" ) ;
SecurityContextHolderStrategy strategy = this . spring . getContext ( ) . getBean ( SecurityContextHolderStrategy . class ) ;
verify ( strategy , atLeastOnce ( ) ) . getContext ( ) ;
}
@WithMockUser
@ -480,12 +500,15 @@ public class PrePostMethodSecurityConfigurationTests {
@@ -480,12 +500,15 @@ public class PrePostMethodSecurityConfigurationTests {
@Bean
@Role ( BeanDefinition . ROLE_INFRASTRUCTURE )
Advisor customBeforeAdvice ( ) {
Advisor customBeforeAdvice ( SecurityContextHolderStrategy strategy ) {
JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut ( ) ;
pointcut . setPattern ( ".*MethodSecurityServiceImpl.*securedUser" ) ;
AuthorizationManager < MethodInvocation > authorizationManager = ( a ,
o ) - > new AuthorizationDecision ( "bob" . equals ( a . get ( ) . getName ( ) ) ) ;
return new AuthorizationManagerBeforeMethodInterceptor ( pointcut , authorizationManager ) ;
AuthorizationManagerBeforeMethodInterceptor before = new AuthorizationManagerBeforeMethodInterceptor (
pointcut , authorizationManager ) ;
before . setSecurityContextHolderStrategy ( strategy ) ;
return before ;
}
}
@ -495,11 +518,11 @@ public class PrePostMethodSecurityConfigurationTests {
@@ -495,11 +518,11 @@ public class PrePostMethodSecurityConfigurationTests {
@Bean
@Role ( BeanDefinition . ROLE_INFRASTRUCTURE )
Advisor customAfterAdvice ( ) {
Advisor customAfterAdvice ( SecurityContextHolderStrategy strategy ) {
JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut ( ) ;
pointcut . setPattern ( ".*MethodSecurityServiceImpl.*securedUser" ) ;
MethodInterceptor interceptor = ( mi ) - > {
Authentication auth = SecurityContextHolder . getContext ( ) . getAuthentication ( ) ;
Authentication auth = strategy . getContext ( ) . getAuthentication ( ) ;
if ( "bob" . equals ( auth . getName ( ) ) ) {
return "granted" ;
}