加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 设置CanCan ability.rs模型

发布时间:2020-12-17 03:52:20 所属栏目:百科 来源:网络整理
导读:我成功地用Devise和CanCan建立了登录系统,我有3种类型的用户.管理员,内部和全球用户.我创建了控制器和索引操作:管理员,Cpanel,报告和状态,我想限制某些用户对此控制器的访问. 管理员用户应具有访问权限:报告(全部),状态(读取),管理员(全部) 全局用户应具有
我成功地用Devise和CanCan建立了登录系统,我有3种类型的用户.管理员,内部和全球用户.我创建了控制器和索引操作:管理员,Cpanel,报告和状态,我想限制某些用户对此控制器的访问.

管理员用户应具有访问权限:报告(全部),状态(读取),管理员(全部)

全局用户应具有访问权限:报告(仅读取),Cpanel(全部)

内部用户应具有访问权限:报告(全部),状态(读取)

我尝试使用ability.rs中的以下代码执行此操作:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)

    if user.role? :admin
      can :manage,[Report,Admin]
      can :read,State
    elsif user.role? :global_user
      can :read,State]
      can :manage,Cpanel
    elsif user.role? :internal_user
      can :manage,Report
      can :read,State     
    end
   end
end

这时我在这个控制器中只有索引操作,当我用内部用户登录app时,我可以访问/ admin,例如,这不是我想要的行为.我想限制访问所有控制器而不是capability.rb类中列出的控制器.

Source code is here

解决方法

如果我要阻止访问整个控制器,我会创建一个before过滤器,如果用户没有admin角色,则会将用户重定向到拒绝访问的页面.可能看起来像:

def check_permissions
 raise CanCan::AccessDenied unless @current_user.role?(:admin)
end

如果我只是想阻止访问更新和创建,我会这样做:

def update
  raise CanCan::AccessDenied unless can?(:update,Thing)
  ...
end

def create
  raise CanCan::AccessDenied unless can?(:create,Thing)
  ...
end

您可以在应用程序控制器中处理CanCan :: AccessDenied异常:

rescue_from CanCan::AccessDenied do |exception|
    flash[:error] = exception.message
    redirect_to no_access_path
  end

我有一些关于CanCan和Devise here和here的相当不错的帖子

UPDATE
我在我的应用程序控制器中使用此方法来设置我当前的用户变量:

# Make the current user object available to views
  #----------------------------------------------------------------------------
  def get_user
    @current_user = session[:current_user]
  end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读