1. 都知道cancancan对于权限管理而言是一个利器。能满足绝大多数的应用场景。
安装也很方便
gem 'cancancan', '~> 1.10'
然后 bundle
- 之后可以构造cancancan的相应文件了
rails g cancan:ability
这样就会在你的models下创建ability.rb文件。(app/models/ability.rb)
同时得确认在你的
app/controllers/application_controller.rb
下存在对于ablity对象的创建
def current_ability
@current_ability ||= Ability.new(current_user)
end
Ok,这样就可以在ability.rb里去定义一些权限操作了。
这些很简单,按照wiki上的来定义就可以了。
如下:
can :manage, Order, :order_type => "some"
类似于这些,这里主要是说下在controller中加入权限的一些问题。
在controller中使用
load_and_authorize_resource
会出现一些情况,例如:
ActiveModel::ForbiddenAttributesError
我们知道,这个是因为参数的问题,白名单。可是在加入之前是好好的,加入了权限的操作之后就出现了。经过查找,是因为params的名字引起的。需要改变为:
def #{model.underscore}_params #Order => order
params.require(:model).permit({
:name,
:address
})
end
这样就可以规避出现的这个问题。
另外一个就是controller的命名与model的命名不符合。
uninitialized constant ControllerNameClass
可以换种加载权限的方式
load_and_authorize_resource => authorize_resource :class => Model
可以发现,这样是可以指定权限的class,就可以规避这种情况。
值得注意的一点是,权限管理的模块过多,全部放在ability下面会显得很臃肿。
我们可以mixin到ability.rb
#lib/permissions/some_manage.rb
module Permissions
module SomeManage
def method
#do somthing
end
end
end
#app/models/ability.rb
class Ability
include CanCan::Ability
include Permissions::SomeManage
def initialize(user)
user ||= StoreStaff.new # guest user (not logged in)
if user.admin.present?
can :manage, :all
else
do_somthing
end
end
def do_somthing
method
end
end
这是碰到的一些小问题,希望可以帮助大家。