TestingAuthenticationToken和@PreAuthorizedTest -anotation被忽略

时间:2014-01-21 12:21:47

标签: spring spring-security

我有以下test-config.xml

               

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="testProvider" /> 
    <authentication-provider> 
        <user-service>
            <user name="department1000" password="password" authorities="ROLE_1000" />
            <user name="user"    password="password2" authorities="ROLE_ALL_DEPT_ACCESS" />
            <user name="user1"    password="password3" authorities="ROLE_STUDENT" />
        </user-service>
    </authentication-provider>
</authentication-manager>

<beans:bean id="testProvider" class="org.springframework.security.authentication.TestingAuthenticationProvider">
</beans:bean>

我需要一种模拟身份验证并赋予角色的方法:

protected void simulateRole(String role) {
    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new SimpleGrantedAuthority(role));
    token = new TestingAuthenticationToken("username","password", authorities);
       securityContext.setAuthentication((getAuthenticationManager().authenticate(token)));

然后我需要调用@PreAuthorized anotated控制器方法进行测试:

@Test(expected = AccessDeniedException.class)
public void testShowAccessDenied() {
    super.simulateRole("ROLE_STUDENT");
    controller.show(new ModelMap(), super.getAuthenticationPrincipal(), Locale.getDefault(), new D(), new E());
    super.getSecurityContext().getAuthentication().getDetails();

我认为我没有设置所需的Principal,因为test没有抛出AccessDeniedException

    public Principal getAuthenticationPrincipal() {
    return (Principal) securityContext.getAuthentication().getDetails();

更改控制器方法参数的类型会导致很多混乱。有什么办法让这个工作?

1 个答案:

答案 0 :(得分:1)

首先,您错过了配置中的global method security。您应该将以下内容添加到test-config.xml:

<global-method-security pre-post-annotations="enabled" />

注意:为了使其在servlet环境中工作,您需要确保将global-method-security标记添加到DispatcherServlet配置而不是根配置described in the FAQ < / p>

我假设您的控制器没有实现接口,因此您需要确保在类路径上有cglib以支持基于类的代理。如果您使用Spring 4.x+ you can add objenesis to your classpath并且您的代理类不再需要默认构造函数。

其次,您需要确保测试中的控制器是由Spring创建的。当Spring创建控制器时,它使用来自代理类的信息并为其添加安全性。

如果您仍然遇到问题,请发布失败的完整测试,您在控制器上测试的方法以及完整的测试代码。