2009-11-27 9 views
4

Je souhaite implémenter l'autorisation dans mon application Rails au niveau du modèle (et non du contrôleur), de la même manière que la validation sur les modèles. Quelle est la meilleure façon de procéder?Autorisation au niveau du modèle dans Rails

Si elle est implémentée dans les modèles elle-même, le problème principal est que les modèles n'ont pas accès à l'utilisateur actuel. J'ai vu des solutions comme: Thread.current[:user_id] = session[:user_id], mais cela ne semble pas être une bonne idée.

J'ai vu une approche différente où des variantes des méthodes comme créer, trouver et nouveau sont créées, en acceptant un paramètre supplémentaire pour l'utilisateur actuel.

Une autre approche serait de mettre en œuvre toutes les méthodes de la classe utilisateur/rôle, donc par exemple user.posts.create ou user.readable_posts.find seraient utilisés au lieu de Post.create ou Post.find.

Laquelle de ces approches serait suggérée? Existe-t-il de meilleurs moyens de mettre en œuvre l'autorisation? Y a-t-il des plugins qui facilitent cela? J'ai besoin d'une approche qui évolue bien pour plusieurs rôles et modèles.

Répondre

1

Je vous recommande de regarder declarative authorization. Cela fonctionne avec les deux modèles et les contrôleurs.

La manière dont vous faites ce que vous demandez est d'avoir un before_filter dans le contrôleur d'application qui définit Authorization.current_user = current_user où Authorization est un module.

Je pense que cette approche est la meilleure, elle garde les modèles propres et vous n'avez pas à vous souvenir d'inclure l'utilisateur partout, mais peut le filtrer dans les fonctions de rappel des modèles à la place.

+0

En utilisant cette approche, comment sont traitées les demandes de la console (ou de toute autre méthode ne passant pas par un contrôleur)? – Ralf

+0

J'ai trouvé la réponse à mon commentaire, Authorization :: Maintenance a des fonctionnalités spécifiques pour cela. À première vue, déclarative_authorization semblait manquer certaines fonctionnalités dont j'avais besoin, mais quand j'ai regardé plus en profondeur, j'ai trouvé que c'était assez puissant. J'aime pouvoir spécifier toutes les permissions dans un fichier séparé. – Ralf

+0

Oui, ça marche plutôt bien avec ça. La majeure partie de la logique est exclue de votre application. Et j'aime la façon dont il vérifie réellement si vous êtes autorisé à faire quelque chose au lieu d'énumérer ce qu'un utilisateur peut faire. Il se sent plus propre. –

0

Pourquoi le feriez-vous? L'identification au niveau du contrôleur n'est-elle pas suffisante?

if @user.is_able_to_do_this? 
    do_this 
else 
    blah! 
end 

... et dans votre modèle

def is_able_to_do_this 
    if self.rights > Constant::Admin_level_whatever 
    return true 
    end 
    return false 
end 
+0

Principalement parce que j'ai un système de permission assez compliqué, qui est plus compliqué et qui ne peut effectuer qu'une action. Par exemple, certains utilisateurs ne devraient pouvoir éditer que des attributs spécifiques du modèle. – Ralf

+0

Il est également plus simple lorsque des actions identiques ou similaires sur un modèle sont référencées à partir de plusieurs contrôleurs. – Ralf

+0

Ok, c'est logique. Je pense que dans ce cas, la réponse de jimmy devrait être une bonne option. – marcgg

Questions connexes