@ -24,6 +24,9 @@ import org.springframework.context.ApplicationListener;
@@ -24,6 +24,9 @@ import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean ;
import org.springframework.context.annotation.Configuration
import org.springframework.core.annotation.Order
import org.springframework.expression.ExpressionParser ;
import org.springframework.mock.web.MockHttpServletRequest ;
import org.springframework.security.access.expression.SecurityExpressionHandler ;
import org.springframework.security.authentication.AuthenticationManager
import org.springframework.security.authentication.event.AuthenticationSuccessEvent ;
import org.springframework.security.config.annotation.BaseSpringSpec
@ -36,7 +39,9 @@ import org.springframework.security.web.access.DefaultWebInvocationPrivilegeEval
@@ -36,7 +39,9 @@ import org.springframework.security.web.access.DefaultWebInvocationPrivilegeEval
import org.springframework.security.web.access.WebInvocationPrivilegeEvaluator ;
import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler ;
import org.springframework.security.web.access.expression.WebSecurityExpressionHandler ;
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor ;
import org.springframework.security.web.util.AnyRequestMatcher
import org.springframework.test.util.ReflectionTestUtils ;
/ * *
* @author Rob Winch
@ -197,11 +202,13 @@ class WebSecurityConfigurationTests extends BaseSpringSpec {
@@ -197,11 +202,13 @@ class WebSecurityConfigurationTests extends BaseSpringSpec {
def "Override webSecurityExpressionHandler" ( ) {
setup:
WebSecurityExpressionHandler expressionHandler = Mock ( )
ExpressionParser parser = Mock ( )
WebSecurityExpressionHandlerConfig . EH = expressionHandler
when:
loadConfig ( WebSecurityExpressionHandlerConfig )
then:
context . getBean ( WebSecurityExpressionHandler ) = = expressionHandler
1 * expressionHandler . getExpressionParser ( ) > > parser
}
@EnableWebSecurity
@ -215,6 +222,13 @@ class WebSecurityConfigurationTests extends BaseSpringSpec {
@@ -215,6 +222,13 @@ class WebSecurityConfigurationTests extends BaseSpringSpec {
web
. expressionHandler ( EH )
}
@Override
protected void configure ( HttpSecurity http ) throws Exception {
http
. authorizeRequests ( )
. expressionHandler ( EH )
. anyRequest ( ) . authenticated ( )
}
}
def "#138 webSecurityExpressionHandler defaults" ( ) {
@ -257,4 +271,46 @@ class WebSecurityConfigurationTests extends BaseSpringSpec {
@@ -257,4 +271,46 @@ class WebSecurityConfigurationTests extends BaseSpringSpec {
. anyRequest ( ) . authenticated ( )
}
}
def "SEC-2303: DefaultExpressionHandler has bean resolver set" ( ) {
when:
loadConfig ( DefaultExpressionHandlerSetsBeanResolverConfig )
then: "the exposed bean has a BeanResolver set"
ReflectionTestUtils . getField ( context . getBean ( SecurityExpressionHandler ) , "br" )
when:
springSecurityFilterChain . doFilter ( request , response , chain )
then: "we can use the BeanResolver with a grant"
noExceptionThrown ( )
when: "we can use the Beanresolver with a deny"
springSecurityFilterChain . doFilter ( new MockHttpServletRequest ( method: 'POST' ) , response , chain )
then:
noExceptionThrown ( )
}
@EnableWebSecurity
@Configuration
static class DefaultExpressionHandlerSetsBeanResolverConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure ( HttpSecurity http ) throws Exception {
http
. authorizeRequests ( )
. anyRequest ( ) . access ( "request.method == 'GET' ? @b.grant() : @b.deny()" )
}
@Bean
public MyBean b ( ) {
new MyBean ( )
}
static class MyBean {
boolean deny ( ) {
false
}
boolean grant ( ) {
true
}
}
}
}