2010-01-26 8 views
0

J'utilise les annotations fournies par le plugin Spring Security (AKA Acegi). J'ai des actions de contrôleur annotées avecGrailles Acegi plugin annotations

@Secured(['ROLE_ADMIN', 'ROLE_USER']) 

Pour indiquer qu'ils doivent être disponibles pour les administrateurs et les utilisateurs réguliers. Mais maintenant, je dois indiquer qu'une action est disponible pour les administrateurs et les utilisateurs non enregistrés. Est-il possible d'utiliser des annotations pour indiquer un utilisateur sans rôle, c'est-à-dire non enregistré?

Merci, Don

Répondre

2

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.

+1

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' –

+0

En passant, excellent travail, je ne m'attendais pas à ce niveau d'aide. –

2

Le jeton est pour ce IS_AUTHENTICATED_ANONYMOUSLY ce qui signifie que toute personne si connecté ou non. IS_AUTHENTICATED_REMEMBERED signifie toute personne connectée avec un cookie remember-me ou via une connexion explicite, et IS_AUTHENTICATED_FULLY signifie une connexion par login explicite (n'utilisant pas de cookie).

Si vous annoter votre action avec

@Secured(['IS_AUTHENTICATED_ANONYMOUSLY']) 

alors il va permettre à quiconque d'accéder à cette action. Vous pouvez combiner ces jetons spéciaux avec des rôles, ainsi, par exemple pour permettre admin-seule force, mais un nom d'utilisateur/mot de passe connexion, même si l'utilisateur a un me souviens cookie vous utiliseriez

@Secured(['ROLE_ADMIN', 'IS_AUTHENTICATED_FULLY']) 
+0

Merci pour la réponse. Ce que je veux exprimer en utilisant les annotations est "non connecté", plutôt que "si connecté ou non", est-ce possible? –