可以从数据库加载专家策略吗?

Luk*_*Mac 7 ruby authorization rubygems pundit

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

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

Nic*_*Roz 7

第一种方式

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
Run Code Online (Sandbox Code Playgroud)

当然,工具的复杂性和灵活性直接相互依赖。

第三种方式

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

第四种方式

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

第五种方式

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