我喜欢Pundit gem的简单性,并且希望通过将策略存储到数据库来使策略动态化。

基本上,我正在寻找一种无需重新部署应用程序即可更改策略的方法。

最佳答案

第一种方式

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

当然,工具的复杂性和灵活性直接取决于彼此。

第三种方式

只是解决。您可以将授权项目与主要项目分开设置,以便其部署(当然,零停机时间)不会影响主要的大型项目。

第4种方式

创建自己的DSL以存储在数据库中

第5种方式

使用json-logic-ruby之类的东西将逻辑存储在数据库中

10-08 02:36