Grails 如何在单元测试中针对spring安全性对用户进行身份验证

Grails 如何在单元测试中针对spring安全性对用户进行身份验证,grails,spring-security,Grails,Spring Security,我正在Grails2.0中使用spring安全核心插件(1.2.7) 假设我的控制器有一个使用@Secured注释的方法 class ArticleController { def springSecurityService @Secured(['ROLE_PREMIUM_USER']) def listPremium() { render 'premium content' } } 在我的单元测试中,我想测试角色为“role\u PREMI

我正在Grails2.0中使用spring安全核心插件(1.2.7)

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

class ArticleController {
    def springSecurityService

    @Secured(['ROLE_PREMIUM_USER'])
    def listPremium() { 
        render 'premium content'
    }
}
在我的单元测试中,我想测试角色为“role\u PREMIUM\u 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'
    }
}

我不确定如何对检查角色\u PREMIUM\u用户的用户或模拟操作进行身份验证。有什么帮助吗?

您可以使用

SpringSecurityUtils.reauthenticate username, null

我们创建了自定义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);

看看这个插件:试试controller.springSecurityServce。如果被授予(“ROLE\u PREMIUM\u USER”),你可能必须从controllerUnitTestCase扩展你的类。看起来链接断了。看起来他们重构了代码,我修复了链接