我公司一直在评估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
对象本身看起来非常不像Spring ...