Вот решение, которое требует, чтобы вы не входили в систему, или у вас есть ROLE_ADMIN. Вам нужен пользовательский избиратель, который обрабатывает новый токен IS_NOT_AUTHENTICATED:
package com.burtbeckwith.grails.springsecurity
import org.springframework.security.Authentication
import org.springframework.security.AuthenticationTrustResolverImpl
import org.springframework.security.ConfigAttribute
import org.springframework.security.ConfigAttributeDefinition
import org.springframework.security.vote.AccessDecisionVoter
class NotLoggedInVoter implements AccessDecisionVoter {
private authenticationTrustResolver = new AuthenticationTrustResolverImpl()
int vote(Authentication authentication, object, ConfigAttributeDefinition config) {
for (configAttribute in config.configAttributes) {
if (supports(configAttribute)) {
if (authenticationTrustResolver.isAnonymous(authentication)) {
// allowed if not logged in
return ACCESS_GRANTED
}
for (authority in authentication.authorities) {
if ('ROLE_ADMIN' == authority.authority) {
// allowed if logged in as an admin
return ACCESS_GRANTED
}
}
}
}
return ACCESS_DENIED
}
boolean supports(ConfigAttribute attribute) {
'IS_NOT_AUTHENTICATED' == attribute?.attribute
}
boolean supports(Class clazz) {
true
}
}
Зарегистрируйте это как bean-компонент в resources.groovy:
beans = {
notLoggedInVoter(com.burtbeckwith.grails.springsecurity.NotLoggedInVoter)
}
и добавьте его в список избирателей в SecurityConfig.groovy, установив свойство 'solutionVoterNames':
decisionVoterNames = ['notLoggedInVoter', 'authenticatedVoter', 'roleVoter']
и аннотируйте действие вашего контроллера следующим образом:
@Secured(['IS_NOT_AUTHENTICATED'])
и он разрешит только пользователям, не прошедшим проверку подлинности, и пользователям, прошедшим проверку подлинности с ROLE_ADMIN.