spring - 模拟身份验证 Spring 安全性

标签 spring spring-security

我有一个使用@Secured 注释的存储库方法。我正在尝试为此方法编写单元测试,但我的测试失败,因为我需要身份验证才能调用该方法。该方法本身恰好是 save() 方法。我调用该方法时得到的错误是:

 org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext

我无法测试此方法,因为它需要身份验证,并且我无法保存用户进行身份验证(我正在使用 hsqldb),因为我需要调用此方法来保存。有关如何对使用 @secured 注释的方法进行单元测试或如何模拟身份验证的任何建议。

最佳答案

这取决于您要测试的内容。

  • 如果您想在没有任何安全性的情况下测试应用程序的业务逻辑,您可以完全禁用安全性。假设您使用SpringJunit4Runner,您可以将安全配置放入单独的文件中,不要将其包含在@ContextConfiguration中。

  • 如果你想测试授权(例如 @Secured 注释的正确工作),你可以直接访问 SecurityContext,绕过所有与身份验证相关的东西(在在这种情况下,您可以将身份验证配置放入单独的文件中,并且不要加载它):

    您只需将适当的 Authentication 对象放入 SecurityContextHolder :

    @Test
    public void myTest() {
        login(...);
        ...
        logout();
    }
    
    private void login(...) {
        SecurityContextHolder.getContext().setAuthentication(
            new UsernamePasswordAuthenticationToken(...)
        )
    }
    
    private void logout() {
        SecurityContextHolder.clearContext();
    }
    
  • 最后,如果要测试身份验证,可以使用包含测试数据的数据库运行测试。

关于spring - 模拟身份验证 Spring 安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946497/

相关文章:

java - 使用固定语言环境运行 Spring Boot 应用程序

java - Spring 为带有附加数据的主体自定义 AuthenticationProvider

java - 使用 EvaluationContextExtensionSupport 和自定义 PermissionEvaluator 将 Spring Boot 2.0.6 迁移到 2.1.0 时出现“无效的 bean 定义”

spring-boot - 如何启用 SAML2 AuthNRequest 签名

java - 视频处理流水线

java - 如何在spring boot-JPA-hibernate中获取所有表元数据?

Spring Neo4j不保存数据

Java Spring 安全密码编码器

java - Hibernate 尝试获取用户时出现 Spring 安全错误

java - 尽管定义了 RequestContextListener,但创建名称为 'scopedTarget.oauth2ClientContext' 的 bean 时出错