【问题标题】:How to switch user using Spring in Java for testing purposes?java - 如何在Java中使用Spring切换用户进行测试?
【发布时间】:2015-02-16 17:02:22
【问题描述】:

我使用 Spring Security SwitchUserFilter 编写了功能。在应用程序中,我可以使用/j_spring_security_switch_user?j_username=xxx URL 切换用户并使用/j_spring_security_exit_user 返回上一个。 我还实现了几种取决于切换用户的方法,所以我想为它们编写单元测试。 因此我的问题是如何在 jUnit 测试环境中切换用户?

【问题讨论】:

    标签: java spring junit spring-security


    【解决方案1】:

    我编写了使用SwitchUserGrantedAuthority 为用户准备并登录的方法。对于我的测试目的而言,它似乎工作正常,但任何提示和cmets 将不胜感激。

    @SuppressWarnings({ "rawtypes", "unchecked" })
    private User logAdminAsUser(User admin, String roleName) {
        SecurityContextHolder.getContext().setAuthentication(
            new TestingAuthenticationToken(admin, null, "ROLE_ADMIN"));
        Authentication adminAuth = SecurityContextHolder.getContext().getAuthentication();
        SwitchUserGrantedAuthority switchUserGrantedAuthority =
            new SwitchUserGrantedAuthority("ROLE_ADMIN", adminAuth);
        List authorities = new LinkedList();
        authorities.add(switchUserGrantedAuthority);
        User user = populator.storeUser("ROLE_USER");
        SecurityContextHolder.getContext().setAuthentication(
            new TestingAuthenticationToken(user, null, authorities));
        return user;
    }
    

    【讨论】:

      【解决方案2】:

      如果您想要一个集成测试,您应该考虑使用自定义 http 客户端,或者如果您的测试逻辑依赖于它,甚至是像 Selenium 这样的 GUI 驱动程序。

      如果我们在谈论单元测试,请参阅 Springs http://spring.io/blog/2014/05/07/preview-spring-security-test-method-security 文档,它们大量支持测试,@WithMockUser 注释似乎是您正在寻找的,它允许您指定应该以哪个角色或用户运行此测试。

      【讨论】:

      • 谢谢,您的回答非常有用。最终我通过使用SwitchGrantedAuthority 准备用户来解决它,这并不像我想象的那么难。如果您有兴趣,我将在今天晚些时候将我的答案放在这里。
      • 是的,很高兴看到您的解决方案。
      【解决方案3】:

      我用过这个:

      private void switchUser(User user, String roleName) 
      {
          Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
      
          Collection<GrantedAuthority> authorities = 
                  new ArrayList<>();
          GrantedAuthority ga = new SimpleGrantedAuthority(roleName);
          authorities.add(ga);
      
          Authentication result = new UsernamePasswordAuthenticationTokenExt(
                  user,
                  authentication.getCredentials(),
                  null,
                  System.currentTimeMillis()
          );
      
          SecurityContextHolder.getContext().setAuthentication( result );
      }
      

      其中User是新用户,roleName是要设置的新权限(当然这个方法可以修改获取更多参数等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多