2009-12-21 5 views
1

J'utilise acl9 en plus d'authlogic sur l'un de mes projets. J'aime l'approche de l'approche acl9 mais je suppose que j'essaie de faire quelque chose qui n'est pas si simple (pour ne pas dire impossible).acl9: Déterminer l'autorisation à l'avance

Pour des raisons de convivialité, je voudrais avoir un panneau d'administration en ligne. Par exemple, disons que j'ai eu une vente aux enchères de ressources et une enchère/enchère de ressources imbriquées. Quand un utilisateur normal est sur auction/1 (1 = id) il devrait voir les choses "normales" (description, prix ...), un utilisateur privilégié sur le même site devrait avoir des liens supplémentaires pour éditer une enchère (= enchères/1/éditer). Et c'est là que le plaisir commence. Peut-être que je n'ai pas regardé assez près ou dans les mauvais endroits mais je n'ai pas pu trouver moyen de déterminer si mon utilisateur actuel est autorisé pour l'action d'édition. Évidemment je pourrais montrer le lien à tout le monde et laisser l'action d'édition rejeter l'utilisateur normal, mais ce n'est pas une option viable. Ce qui me dérange ici, c'est que l'information est déjà dans le système (voir le bloc access_control ci-dessous) et je n'arrive pas à trouver un moyen de l'utiliser. Ce n'est pas sec sur tant de niveaux.

access_control do 
    allow :privileged, :to => [:index, :show, :edit, :update] 
    allow anonymous, :to => [:new, :show, :create] 
end 

Il devient encore pire si je veux déterminer quels droits un utilisateur sur auctions/1/bids/2/edit parce que c'est un contrôleur totalement différent.

Comment puis-je accéder à ces informations à l'avance et décider ensuite d'afficher ou non un lien à modifier? Est-ce que ce n'est tout simplement pas possible (sans changer acl9 lui-même) ou n'ai-je pas regardé assez fort? Y a-t-il des plugins d'autorisation qui répondent mieux à mes exigences?

Répondre

1

Qu'entendez-vous par l'accéder à "à l'avance"? Voulez-vous rendre des modèles différents pour les différents utilisateurs, ou simplement avoir des conditions dans le modèle pour masquer/afficher certaines parties en fonction des niveaux d'accès de l'utilisateur? Je crois qu'il devrait être aussi simple que d'avoir quelque chose comme cela dans le code ou le modèle:

if current_user.has_role?(:privileged) 
    # here goes the stuff that should be displayed to privileged user only 
end 

Si vous avez besoin d'accéder à votre ensemble de règles spécifiques dans le modèle (comme « ai-je permis à cet utilisateur d'accéder à l'édition action? ") vous ne pouvez pas le faire avec acl9. Et je crois que vous ne devriez pas le faire de toute façon, car il ne semble pas bon d'attacher votre logique d'entreprise et contrôle d'autorisation à votre contrôleur - si vous décidez de renommer le contrôleur demain, votre logique avec l'échec. Mais il peut voir deux façons de le résoudre.

  1. Divisez vos rôles en rôles plus détaillés. Par exemple, divisez "privileged" en "editor", "creator", "deleter", etc. Ainsi vous pouvez construire vos règles d'accès avec ces règles plus petites et les utiliser dans le template pour un contrôle précis.

  2. Les rôles de délégué vérifient vos objets. C'est comme ça que je le fais habituellement dans mes projets, car cela permet de travailler uniquement avec des rôles globaux et de laisser les modèles décider si l'utilisateur est autorisé à leur faire quelque chose - comme if @auction.allows_edit_for?(current_user) {}, par exemple. Il nécessite quelques remplacements pour l'acl9, j'ai blogué à propos de cette méthode il y a quelque temps here.

Questions connexes