使用Spring Security进行单元测试

我的公司一直在评估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 Security不会使Authentication对象作为容器中的bean可用,因此无法轻松地将其注入或自动接线。

在开始使用Spring Security之前,我们将在容器中创建一个会话范围的bean来存储Principal,将其注入“

AuthenticationService”(单例),然后将该bean注入需要当前Principal知识的其他服务中。

如果要实现自己的身份验证服务,则基本上可以执行相同的操作:创建一个具有“

principal”属性的会话范围的Bean,将其注入到身份验证服务中,让auth服务在成功的auth上设置该属性,然后根据需要使auth服务可用于其他bean。

对于使用SecurityContextHolder,我不会感到很糟糕。虽然。我知道这是静态的/

Singleton,Spring不鼓励使用此类东西,但它们的实现要注意根据环境适当地表现:会话范围在Servlet容器中,线程范围在JUnit测试中,等等。真正的限制因素Singleton的含义是它提供对不同环境不灵活的实现。

以上是 使用Spring Security进行单元测试 的全部内容, 来源链接: utcz.com/qa/400729.html

回到顶部