【发布时间】:2023-09-17 11:15:01
【问题描述】:
我正在使用CanCanCan 进行授权。管理员可以管理所有内容,因此他们没有每个用户 ID 规则。结果是默认情况下他们无法为自己创建项目。看起来我需要添加一堆额外的管道以使我的控制器中的create 对管理员的工作方式与对一般用户的工作方式相同。原因似乎是Ability#attributes_for 没有为管理员用户提供 user_id 属性。
其他人是如何解决这个问题的?您是否正在编写代码来专门处理视图或控制器中的管理用例?
技能类的相关部分
if user.admin?
can manage, :all
else
can manage, Purchase, user_id: user.id
end
示例交互
2.6.2 :012 > Ability.new(User.find(3)).attributes_for(:create, Purchase)
=> {:user_id=>3}
2.6.2 :013 > Ability.new(User.find(4)).attributes_for(:create, Purchase)
=> {}
用户 3 是 general_user,用户 4 是管理员
在控制器中
# relying on load_and_authorize_resource
def create
puts @purchase.user_id # => nil for admin, 3 for general user
# have to add this for admin use case
@purchase.user = current_user
...
end
【问题讨论】:
-
我真的不明白你想要达到什么目的?管理员可以对任何事情进行 CRUD,还是要限制他们的能力?
-
嗯,我现在看到了你的控制器代码......我认为你不应该使用这种方法。 CanCanCan 能力用于定义访问权限,而不是用于分配用户 ID。让我快速写一个答案。
标签: ruby-on-rails ruby-on-rails-5 cancan cancancan