Je travaille sur une application Web Rails, et elle est actuellement utilisée par une vingtaine d'utilisateurs.Meilleure façon d'implémenter une autorisation fine pour une application Web?
Certaines parties de l'application ne sont accessibles que par certains utilisateurs, nous avons donc déjà un cadre d'autorisation de base en place, que j'ai implémenté en utilisant le plugin acts_as_authenticated. Les privilèges des utilisateurs dépendent du département dans lequel ils travaillent. Par exemple, l'administration a accès à toutes les parties de l'application, tandis que la comptabilité n'a accès qu'aux parties liées à la comptabilité et que les ventes ont uniquement accès aux données liées aux ventes. parts, etc.
D'autre part, les utilisateurs voient les liens vers des actions pour lesquelles ils ont des privilèges insuffisants. Par exemple, ceux du département des ventes voient un lien vers les enregistrements financiers dans le menu principal, mais quand ils cliquent dessus, rien ne se passe. Il en est ainsi car AFAIK il n'y a aucun moyen efficace d'interroger les privilèges de l'utilisateur en utilisant acts_as_authenticated.
Je veux changer cela de deux façons:
Je veux présenter l'autorisation à grain plus fin. Actuellement, l'autorisation est effectuée au niveau du contrôleur. Je veux faire cela au niveau de l'action ou du modèle. Par exemple, je souhaite que ceux du département des ventes puissent créer et mettre à jour les paiements, mais pas les supprimer. Je veux être en mesure d'interroger efficacement les privilèges de l'utilisateur, afin de pouvoir supprimer les liens inutiles (et confus) de l'interface.
Selon vous, quelle est la façon la plus élégante de mettre en œuvre cette solution?
Les réponses spécifiques à Rails ne sont pas nécessaires, je veux juste savoir comment cela devrait être implémenté dans une application pilotée par les données.
Enfin, voici comment il est mis en œuvre actuellement:
def authorized?
current_user.role.foo? or current_user.role.bar?
end
Et voici mon idée initiale, que je pense est pas la meilleure façon de résoudre ce:
+------------+------------+---------+ | department | controller | action | +------------+------------+---------+ | accounting | payments | index | | accounting | payments | new | | accounting | payments | create | | accounting | payments | edit | | accounting | payments | update | | accounting | payments | destroy | | sales | payments | new | | sales | payments | create | | sales | payments | edit | | sales | payments | update | +------------+------------+---------+
ou
+------------+----------+-------+--------+------+--------+--------+ | department | model | list | create | read | update | delete | +------------+----------+-------+--------+------+--------+--------+ | accounting | payments | TRUE | TRUE | TRUE | TRUE | TRUE | | sales | payments | FALSE | TRUE | TRUE | TRUE | FALSE | +------------+----------+-------+--------+------+--------+--------+
J'ai déjà une table departments et une table users_departments. J'ai simplifié le tableau d'exemple pour la brièveté. –