gpt4 book ai didi

ruby-on-rails - Rails 4 - Pundit with Rolify - 允许一组角色

转载 作者:行者123 更新时间:2023-12-04 15:32:27 26 4
gpt4 key购买 nike

我正在尝试使用 Rails 4 制作应用程序。

我用 Rolify gem 定义了一系列角色。

现在,我想使用 pundit 允许具有角色的用户执行某些操作。在不止一种类型的角色可以做某事的情况下,我定义了一组角色。

在我的 application_policy 中,我定义了私有(private)方法,这些方法列出了我想在权威权限中使用的角色组。

我的应用程序策略实例化用户和记录。然后我将记录定义为相关模型的名称(与该模型的策略名称相同)。

我有:

class ApplicationPolicy
attr_reader :user, :record

def initialize(user, record)
@user = user
@record = record
end

def index?
false
end

def show?
scope.where(:id => record.id).exists?
end

def create?
false
end

def new?
create?
end

def update?
false
end

def edit?
update?
end

def destroy?
false
end

def scope
Pundit.policy_scope!(user, record.class)
end

class Scope
attr_reader :user, :scope

def initialize(user, scope)
@user = user
@scope = scope
end

def resolve
scope
end
end

private


def cf_legal
[ :Admin, :CF_Legal, :CF_Policy_Manager ]
end

def cf_content
[ :Admin, :CF_Author, :CF_Editor ]
end


end

然后在我的内容政策中,我想说:
def record
content
end

def create
user.has_role? :cf_content
end

当我保存并尝试它时,我看不到我应该看到的东西(作为具有 Author 角色的用户)。

谁能看到如何做到这一点?

最佳答案

tl;dr:在 Policy 类上使用查询方法。

首先,模型应该有它自己的 Policy 类(可选地)扩展你的 ApplicationPolicy 类。假设您的模型名为 Post .然后你可以做类似的事情:

class PostPolicy < ApplicationPolicy

attr_reader :user, :post

def initialize(user,post)
@user = user
@post = post
end

def create?
cf_content.all? { |role| user.has_role?(role) }
end

private

def cf_content
[ :Admin, :Author, :Editor ]
end
end


class PostsController
def create
@post = Post.new(params[:post])
authorize @post, :create?
# @post.save and redirect, etc.
end
end

并且授权调用将调用 create?查询方法并检查用户是否具有 cf_content 中的角色。

您甚至可能不需要添加第二个参数 create? ,作为专家 documentation说:

The authorize method automatically infers that Post will have a matching PostPolicy class, and instantiates this class, handing in the current user and the given record. It then infers from the action name, that it should call update? on this instance of the policy.



或者在你的情况下, create?而不是 update? .

关于ruby-on-rails - Rails 4 - Pundit with Rolify - 允许一组角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35531967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com