嘲笑认证弹簧安全

vik*_*dat 14 spring spring-security

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

 org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
Run Code Online (Sandbox Code Playgroud)

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

axt*_*avt 15

这取决于你想要测试的内容.

  • 如果您想在没有任何安全性的情况下测试应用程序的业务逻辑,则可以完全禁用安全性.假设您使用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();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 最后,如果要测试身份验证,可以使用包含测试数据的数据库运行测试.


Sea*_*oyd 5

a)这不是单元测试,而是集成测试.单元测试没问题.

b)我会尝试将您的测试设置分开.为什么不在您未测试安全相关功能的测试中使用deactive spring security?

c)如果所有其他方法都失败了:JdbcTemplate在测试设置期间注入一个对象并在SQL中手动创建用户数据.请参阅支持类以进行集成测试