Voici une solution qui nécessite que vous n'êtes pas connecté, ou que vous avez ROLE_ADMIN. Vous avez besoin d'un électeur personnalisé qui traite un nouveau « IS_NOT_AUTHENTICATED » jeton:
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
}
}
inscrire cela comme un haricot dans resources.groovy:
beans = {
notLoggedInVoter(com.burtbeckwith.grails.springsecurity.NotLoggedInVoter)
}
et l'ajouter à la liste des électeurs par SecurityConfig.groovy définissant la propriété 'decisionVoterNames':
decisionVoterNames = ['notLoggedInVoter', 'authenticatedVoter', 'roleVoter']
et annoter votre action de contrôleur avec ceci:
@Secured(['IS_NOT_AUTHENTICATED'])
et il autorisera uniquement les utilisateurs non authentifiés et les utilisateurs authentifiés avec ROLE_ADMIN.
Je pense qu'il serait préférable d'un point de vue de la conception de changer la signification de IS_NOT_AUTHENTICATED de (admin ou non authentifié) à simplement (non authentifié). Vraisemblablement, vous pouvez combiner ce jeton avec n'importe quelle combinaison de jetons ROLE_. Vraisemblablement ce changement pourrait être fait en supprimant la dernière boucle «for» dans 'NotLoggedInVoter.vote' –
En passant, excellent travail, je ne m'attendais pas à ce niveau d'aide. –