我有以下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();
更改控制器方法参数的类型会导致很多混乱。有什么办法让这个工作?
答案 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创建控制器时,它使用来自代理类的信息并为其添加安全性。
如果您仍然遇到问题,请发布失败的完整测试,您在控制器上测试的方法以及完整的测试代码。