Как аутентифицировать пользователя с помощью spring Безопасность в модульных тестах

Я использую spring плагин ядра безопасности (1.2.7) с grails 2.0

Скажем, что у меня есть контроллер с методом, который использует аннотацию @Secured.

class ArticleController {
    def springSecurityService

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

в моем unit test Я бы хотел проверить, может ли пользователь с ролью 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. Любая помощь?

Ответ 1

Возможно, вы сможете использовать

SpringSecurityUtils.reauthenticate username, null

Ответ 2

Мы создали нашу собственную аутентификациюHelper:

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);