【问题标题】:How to use cancancan?如何使用康康康?
【发布时间】:2014-12-08 11:33:15
【问题描述】:
我想在我的 rails 应用中授予用户权限。我有可以创建、更新和删除所有帖子和 cmets 的“管理员”,只能创建和更新他自己的 cmets 的“用户”,以及不能执行这些操作的“访客”。为此,我使用宝石“设计”和“康康康”。我了解“设计”宝石,但不了解“康康康”。
在类ability.rb中,如何为这些用户(admin、user、guest)写权限?
【问题讨论】:
标签:
ruby-on-rails
authorization
cancancan
【解决方案1】:
Cancancan 允许您仅定义给定上下文的权限。此上下文可能是不属于cancancan 的用户角色,因此必须由您自己定义角色。
有多种方式来定义用户角色,例如
- 作为
Role 模特,
- 导轨enum,
- 建议here,
- 作为
User 模型的字符串属性。
这完全取决于用例。可以在here 找到如何定义能力的示例。在您的情况下,它看起来像:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.reviewer? #Just a logged user
can :manage, Comment, { owner_id: user.id }
elsif user.admin?
can :manage, :all
end
end
end
class User < ActiveRecord::Base
enum role: [ :reviewer, :admin ]
end
【解决方案3】:
如果您要使用角色,请考虑将 CanCanCan 与 RoleModel (https://github.com/martinrehfeld/role_model) 结合在一起的 Canard gem (https://github.com/james2m/canard)。这为您提供了一种有条理的方式来规定角色及其能力
例如,如果您有一个用户模型,您将按如下方式设置角色:
class User < ActiveRecord::Base
acts_as_user roles: [:supervisor, :manager, :writer]
end
然后您可以为每个角色创建能力文件,包括基本用户(未分配任何角色)和访客(未登录)
Canard::Abilities.for(:user) do
can :manage, User, id: user.id
cannot [:destroy], User
end
以上将允许用户更新自己的信息,但不允许他们删除自己。他们也将无权访问任何其他用户记录。