我的公司一直在评估 Spring MVC,以决定我们是否应该在下一个项目中使用它。到目前为止,我喜欢我所看到的,现在我正在研究 Spring Security 模块,以确定它是否是我们可以/应该使用的。
我们的安全要求非常基本; 用户只需要提供一个用户名和密码就可以访问网站的某些部分(比如获取他们账户的信息) ; 网站上有一些页面(FAQ,Support 等)应该给予匿名用户访问权限。
在我创建的原型中,我一直在 Session 中为一个经过身份验证的用户存储一个“ LoginCredenals”对象(它只包含用户名和密码) ; 例如,一些控制器检查这个对象是否在 Session 中以获取对已登录用户名的引用。我希望用 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
对象本身看起来非常不像 Spring..。