2010-02-14 13 views
3

Je développe une application grails.Dans certains cas, je veux contrôler les champs de classe de domaine en fonction du rôle. Ainsi, dans chaque appel à getter setter méthode de classe de domaine que je veux appliquer un filtre basé sur le rôle (rôle de l'utilisateur connecté). Je suppose que les grails vont créer getter setter méthode à l'exécution pour les classes domin.So tout en écrivant grails code est-il possible d'appliquer cette logique.Si c'est possible alors comment appliquer?Accès au champ de classe de domaine basé sur le rôle dans grails

Exemple:

Classe Domaine:

class Book{ 
    String name; 
    double price; 

    } 

Controller:

def index={ 
    Book book=Book.get(1); 
    println book.name; 
    println book.price; 
} 

Dans le code ci-dessus "de book.price println;" cette ligne devrait fonctionner seulement pour le rôle particulier. Pour un autre rôle il devrait jeter une certaine exception.

Est-il possible de réaliser? Existe-t-il un plugin pour cela?

S'il vous plaît donner un peu d'aide sur ce .... Merci

Répondre

1

Vous pouvez créer les méthodes get/définies pour les propriétés que vous souhaitez contrôler l'accès à et de mettre votre logique de sécurité là-bas. En supposant que vous avez écrit votre propre service de sécurité ou utilisez un plug-in de sécurité comme le Spring Security (Acegi) plugin vous:

class Book{ 
    String name; 
    double price; 

    def authenticateService 

    void setPrice(double price) { 
     if(!authenticateService.ifAllGranted('ROLE_PRICE_FIXER')) { 
      throw new Exception("You are not authorized to set book prices") 
     } 
     this.price = price 
    } 

    double getPrice() { 
     if(!authenticateService.ifAllGranted('ROLE_PRICE_FIXER')) { 
      throw new Exception("You are not authorized to get book prices") 
     } 
     return this.price 
    } 
} 

Je ne suis pas au courant d'aucun plug-in qui permet des contrôles d'accès à mettre sur les propriétés de domaine .

0

Vous pouvez également envisager d'utiliser un validateur personnalisé ou un objet d'erreur de ressort pour intercepter les tentatives de définition d'un champ avant de l'enregistrer.

EDIT: Voici un exemple de ce que je pensais. Vous pouvez généraliser un peu plus et le code ici n'a pas été testé, donc il ne fonctionnera probablement pas tel quel.

class securedDomain { 
    String securedField 

    def fieldSetBy = [:] 
    def previousValue = [:] 
    static transients = ['fieldSetBy', 'previousValue'] 

    static constraints = { 
     securedField(validator: { v, o -> 
      def access = User.findByName(fieldSetBy['securedField']).hasAccess('securedField') 
      if(!access) securedField = previousValue['securedField'] 
      return access 
     }) 

    void setProperty(String name, value) { 
     if(name == "securedField") { 
      fieldSetBy['securedField'] = session.user 
      previousValue['securedField'] = securedField 
      securedField = value 
     } else { 
      super(name, value) 
     } 
    } 
+0

Pouvez-vous s'il vous plaît fournir un exemple de code. – DonX

+0

Bien sûr, j'ai édité le post pour donner un échantillon de ce que je pensais. – Blacktiger