rails 使用cancancan的一些心得

本文分享了在Rails项目中使用Cancancan进行权限管理的经验。介绍了安装Cancancan、配置ability.rb文件以及在控制器中处理权限操作时遇到的参数白名单和控制器命名不匹配的问题,并提供了相应的解决方案。通过将权限规则分离到单独模块,可避免ability文件过于臃肿。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 都知道cancancan对于权限管理而言是一个利器。能满足绝大多数的应用场景。
安装也很方便

gem 'cancancan', '~> 1.10'

然后 bundle

  1.  之后可以构造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

这是碰到的一些小问题,希望可以帮助大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值