当前位置: 首页 > 面试题库 >

使用Spring Security进行单元测试

左丘边浩
2023-03-14
问题内容

我的公司一直在评估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的含义是它提供对不同环境不灵活的实现。



 类似资料:
  • 问题内容: 我选择的数据库是MongoDB。我正在编写一个数据层API,以从客户端应用程序中抽象实现细节- 也就是说,我实质上是在提供一个公共接口(一个充当IDL的对象)。 我正在以TDD方式测试自己的逻辑。在每个单元测试之前,调用一个方法来创建数据库单例,此后,当测试完成时,将调用一个方法来删除数据库。这有助于促进单元测试之间的独立性。 几乎所有单元测试(即 执行上下文查询 )都需要先进行某种插

  • 我想测试以下骆驼路线。我在网上找到的所有例子都有以文件开头的路由,在我的例子中,我有一个Springbean方法,每隔几分钟就会被调用一次,最后消息被转换并移动到jms以及审计目录。 我对这条路线的写测试毫无头绪。目前我在测试用例中所拥有的是

  • 我正在构建一个android应用程序,它使用Firebase作为后端,并采用模型、视图和演示者架构。然而,Firebase是一种云服务的事实使我的android应用程序中的自动测试变得复杂。到目前为止,我已经构建了大部分身份验证系统,但无法看到如何在我的应用程序中实现Firebase代码的单元测试。在端到端测试方面,我也陷入了困境。 由于测试是任何android应用程序的基础,没有it应用程序开发

  • 使用Android Studio进行单元测试 原文链接 : Unit Testing With Android Studio 原文作者 : Rex St John 译文出自 : 开发技术前线 www.devtf.cn 译者 : ZhaoKaiQiang 校对者: zhengxiaopeng 状态 : 校对完 这篇文章介绍了在Android Studio中进行单元测试的基础部分。 很多教程都指导你应

  • 我想测试我的SpringBoot应用程序,它使用cassandra作为CrudRepository。我最终得到了 具有 和 这就导致了 如果我使用旧版本的cassandra-unit-Spring 它以NullPointerException结束,因为没有注入值repo。 来源https://github.com/StephanPraetsch/spring.boot.cassandra.unit

  • 问题内容: 我对Node相对较新,并且正在使用knex和书架进行项目。我在对代码进行单元测试时遇到了一些麻烦,但是我不确定自己做错了什么。 基本上,我有一个看起来像这样的模型(称为VorcuProduct): 还有一个函数,如果数据库中不存在VorcuProduct,它将保存它。非常简单。执行此操作的函数如下所示: 哪种方法可以在不影响数据库的情况下进行测试?我是否需要模拟以返回模型或未定义模型(