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