我的公司一直在评估 Spring MVC,以确定我们是否应该在下一个项目中使用它。到目前为止,我喜欢我所看到的,现在我正在查看 Spring Security 模块以确定它是否是我们可以/应该使用的东西。
我们的安全要求非常基本;用户只需要能够提供用户名和密码即可访问网站的某些部分(例如获取有关其帐户的信息);并且网站上有一些页面(常见问题解答、支持等)应该允许匿名用户访问。
在我创建的原型中,我在 Session 中为经过身份验证的用户存储了一个“LoginCredentials”对象(仅包含用户名和密码);例如,一些控制器会检查该对象是否处于会话中以获取对登录用户名的引用。我正在寻找用 Spring Security 替换这种本土逻辑,这将有一个很好的好处,即删除任何类型的“我们如何跟踪登录的用户?” 和“我们如何验证用户?” 从我的控制器/业务代码。
似乎 Spring Security 提供了一个(每线程)“上下文”对象,以便能够从应用程序中的任何位置访问用户名/主体信息......
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
...在某种程度上,这似乎非常不像 Spring,因为这个对象是一个(全局)单例。
我的问题是:如果这是在 Spring Security 中访问有关经过身份验证的用户的信息的标准方法,那么将 Authentication 对象注入 SecurityContext 以便在单元测试需要时可用于我的单元测试的可接受方法是什么?认证用户?
我需要在每个测试用例的初始化方法中连接它吗?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
这似乎过于冗长。有没有更简单的方法?
SecurityContextHolder
物体本身看起来很不像春天......