如何在单元测试中针对 Spring Security 对用户进行身份验证
Posted
技术标签:
【中文标题】如何在单元测试中针对 Spring Security 对用户进行身份验证【英文标题】:How to authenticate user against spring Security in unit tests 【发布时间】:2012-05-17 11:34:23 【问题描述】:我正在使用带有 grails 2.0 的 spring 安全核心插件 (1.2.7)
假设我有一个使用@Secured 注解的方法的控制器。
class ArticleController
def springSecurityService
@Secured(['ROLE_PREMIUM_USER'])
def listPremium()
render 'premium content'
在我的单元测试中,我想测试具有角色“ROLE_PREMIUM_USER”的用户是否可以看到 listPremium 方法的内容。我该怎么做?
我知道应该是这样开始的:
@TestFor(ArticleController)
@Mock([SpringSecurityService])
class ArticleControllerTests
void testListPremium()
defineBeans
springSecurityService(SpringSecurityService)
//but how to login the user here in order to see premium content?
controller.listPremium()
assert response.text() == 'premium content'
我不确定如何验证用户或检查 ROLE_PREMIUM_USER 的模拟操作。有什么帮助吗?
【问题讨论】:
看看这个插件:spring-security-mock 试试 controller.springSecurityServce.ifAnyGranted("ROLE_PREMIUM_USER") 你可能需要从 ControllerUnitTestCase 扩展你的类 【参考方案1】:你可以使用
SpringSecurityUtils.reauthenticate username, null
【讨论】:
链接好像坏了。 看起来他们重构了代码,我修复了链接【参考方案2】:我们创建了我们的自定义 AuthenticationHelper:
public final class AuthenticationHelper
public static Authentication authenticate(UserDetailsService userDetailsServiceImpl, String userName)
UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(userName);
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword());
UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(userDetails, token.getCredentials(), userDetails.getAuthorities());
result.setDetails(token.getDetails());
Authentication auth = result;
SecurityContextHolder.getContext().setAuthentication(auth);
auth = SecurityContextHolder.getContext().getAuthentication();
Assert.assertTrue(auth.isAuthenticated());
return auth;
重要的部分是:
SecurityContextHolder.getContext().setAuthentication(auth);
【讨论】:
以上是关于如何在单元测试中针对 Spring Security 对用户进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Spring + EasyMock做Java单元测试
如何使用 Spring 在单元测试中模拟远程 REST API?