J'aime la simplicité de la gemme Pundit et je voudrais rendre les politiques dynamiques en les stockant dans la base de données. Fondamentalement, je suis à la recherche d'un moyen de pouvoir modifier les politiques sans avoir besoin de redéployer l'application.Les politiques Pundit peuvent-elles être chargées à partir de la base de données?
Répondre
1er chemin
politique Pundit est pur code Ruby, donc si vous ne voulez pas conserver le code dans la base de données et d'évaluer de façon dynamique, je dirais que la réponse est non. C'est dangereux. Vous pouvez essayer, cependant.
2ème voie
Mais rien ne vous empêche de créer le modèle qui maintient les règles en JSON simples et de les comparer en utilisant Pundit, par exemple:
class PostPolicy < ApplicationPolicy
def update?
access_setting = PolicySetting.find_by(key: self.class_name)
user.role.in?(access_setting['roles'])
end
end
Bien sûr, la complexité et la flexibilité de l'outil directement dépend les uns des autres.
3ème voie
est un travail juste. Vous pouvez définir votre projet d'autorisation en dehors de celui principal, de sorte qu'il se déploie (zéro temps d'arrêt, bien sûr) n'affecterait pas le grand projet principal.
4ème façon
Créez votre propre DSL à stocker dans la base de données
5 manière
Utilisez quelque chose comme json-logic-ruby pour stocker la logique dans la base