允许当前用户在Ruby on Rails中扮演角色的参数的优雅方式?

时间:2018-01-13 10:19:48

标签: ruby-on-rails authorization pundit

我的应用程序有3个角色::admin, :manager, :editor并允许所有人创建产品。但是这些用户没有相同的允许参数。

:admin => params.require(:product).permit(:a, :b, :c, :d)
:manager => params.require(:product).permit(:a, :c, :d)
:editor => params.require(:product).permit(:b, :d)

我不想删除密钥,因为逻辑非常复杂且难以阅读。我正在寻找按行动和角色定义逻辑的方式。

我如何通过他们的角色允许参数?最好的方法是什么? Pundit有没有授权方式?

非常感谢你。

注意: [:a,:b,:c,:d] 是通过使用Pundit检查策略生成的动态。 Pundit是否有任何扩展名?

3 个答案:

答案 0 :(得分:1)

根据角色将属性设置为常量。

ADMIN_ATTRIBUTES = [:a, :b, :c, :d]
MANAGER_ATTRIBUTES = [:a, :c, :d]
EDITOR_ATTRIBUTES = [:b, :d]

然后你可以添加三种允许参数的方法,并根据当前用户角色调用它们。

def admin_params
  params.require(:product).permit(ADMIN_ATTRIBUTES)
end

def manager_params
  params.require(:product).permit(MANAGER_ATTRIBUTES)
end

def editor_params
  params.require(:product).permit(ADITOR_ATTRIBUTES)
end

答案 1 :(得分:1)

我通常在ParamsSanitizer内创建模块app/services

在控制器中,我这样称呼:ParamsSanitizer::Products.sanitize(params, current_user)

所有逻辑都将在这些类中定义。

答案 2 :(得分:0)

我不确定这是否是你想要的,但你可以做类似

的事情
def product_params
  case current_user.role
  when :admin
    params.require(:product).permit(:a, :b, :c, :d)
  when :manager
    params.require(:product).permit(:a, :c, :d)
  when :editor
    params.require(:product).permit(:b, :d)
  end
end