【问题标题】:How to authenticate user against spring Security in unit tests如何在单元测试中针对 Spring Security 对用户进行身份验证
【发布时间】:2012-05-17 11:34:23
【问题描述】:

我正在使用带有 grails 2.0 的 spring 安全核心插件 (1.2.7)

假设我有一个使用@Secured 注解的方法的控制器。

class ArticleController {
    def springSecurityService

    @Secured(['ROLE_PREMIUM_USER'])
    def listPremium() { 
        render 'premium content'
    }
}

在我的单元测试中,我想测试具有角色“ROLE_PREMIUM_USER”的用户是否可以看到 listPremium 方法的内容。我该怎么做?

我知道应该是这样开始的:

@TestFor(ArticleController)
@Mock([SpringSecurityService])
class ArticleControllerTests {
    void testListPremium() {
    defineBeans {
        springSecurityService(SpringSecurityService)
    }
         //but how to login the user here in order to see premium content?

        controller.listPremium()
        assert response.text() == 'premium content'
    }
}

我不确定如何验证用户或检查 ROLE_PREMIUM_USER 的模拟操作。有什么帮助吗?

【问题讨论】:

  • 看看这个插件:spring-security-mock
  • 试试 controller.springSecurityServce.ifAnyGranted("ROLE_PREMIUM_USER") 你可能需要从 ControllerUnitTestCase 扩展你的类

标签: grails spring-security


【解决方案1】:

你可以使用

SpringSecurityUtils.reauthenticate username, null

【讨论】:

  • 链接好像坏了。
  • 看起来他们重构了代码,我修复了链接
【解决方案2】:

我们创建了我们的自定义 AuthenticationHelper:

public final class AuthenticationHelper {

    public static Authentication authenticate(UserDetailsService userDetailsServiceImpl, String userName) {

        UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(userName);

        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword());

        UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(userDetails, token.getCredentials(), userDetails.getAuthorities());
        result.setDetails(token.getDetails());
        Authentication auth = result;

        SecurityContextHolder.getContext().setAuthentication(auth);
        auth = SecurityContextHolder.getContext().getAuthentication();

        Assert.assertTrue(auth.isAuthenticated());

        return auth;
    }
}

重要的部分是:

SecurityContextHolder.getContext().setAuthentication(auth);

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 2019-01-23
    • 2020-04-16
    • 2011-08-12
    • 2013-10-23
    • 2019-12-26
    • 2022-01-22
    • 2011-08-21
    相关资源
    最近更新 更多