我喜欢Pundit gem的简单性,我想通过将策略存储到数据库来使策略动态化。
基本上我正在寻找一种能够在不需要重新部署应用程序的情况下更改策略的方法。
答案 0 :(得分:3)
第一路
Pundit策略是纯ruby代码,所以如果你不想将代码保存在数据库中并动态评估它,我会说答案是否定的。这是不安全的。不过,你可以试一试。
第二路
但没有什么可以阻止你创建模型,该模型将规则保存在简单的json中并使用Pundit进行比较,例如:
class PostPolicy < ApplicationPolicy
def update?
access_setting = PolicySetting.find_by(key: self.class_name)
user.role.in?(access_setting['roles'])
end
end
当然,该工具的复杂性和灵活性直接相互依赖。
第三种方式
只是解决方法。您可以将授权项目设置为与主要项目不同,因此它的部署(当然是零停机时间)不会影响主要的大项目。
第四路
创建您自己的DSL以存储在数据库中
第五种方式
使用json-logic-ruby之类的东西在数据库中存储逻辑