位置控制器中的CanCan :: AccessDenied#显示所有角色

时间:2012-11-11 20:15:58

标签: ruby-on-rails-3 devise roles cancan

使用CanCan进行授权并设计用于身份验证。我有三个角色。管理员角色可以访问所有操作。但是当我以管理员身份登录时,我仍然会拒绝访问。我究竟做错了什么??我也一直关注this wiki for implementation

这是我的控制器代码

class LocationController < ApplicationController
  #before_filter :authenticate, :only => [:title_clearing]
  before_filter :authenticate_user!
  load_and_authorize_resource

  def show
    @data = []
    if params[:Date].match(/^(19|20)\d\d[- \/.](0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])$/).nil? == true
      @message = "Wrong Date Format"
    else
      @data = Location.show(params[:Date])
      if @data.size == 0
        @message = "No data exists for "+ params[:Date]
      else
        @message = "Data loaded successfully for "+ params[:Date]
      end
    end

    if params[:Date] == "all"
      @message = "All records loaded"
      @data = Location.show("all")
    end

  end
end

在ability.rb

if user.is? :admin
    can :all, :location 
end
if user.is? :titleclearing
    can :title_clearing, :location
end
if user.is? :acquisitions
    cannot :title_clearing, :location 
end

在用户模型中

def role?(role)
    roles.include? role.to_s
end

3 个答案:

答案 0 :(得分:1)

用户正确的CanCan约定:

if user.is? :admin
  can :manage, Location
end

或者,您可以管理所有:

can :manage, :all

答案 1 :(得分:1)

也许这是因为Ability Precedence。根据您在ability.rb中的定义,我认为:

  • 用户具有角色acquisitions继承的用户具有角色titleclearingadmin的能力。
  • 用户具有角色titleclearing继承的用户具有角色admin的能力。

所以,正如你所说,"now everyone's being let through",因为所有用户现在都具有admin的能力。尝试改变这样的能力顺序:

if user.is? :titleclearing
  can :title_clearing, :location
end
if user.is? :acquisitions
  cannot :title_clearing, :location 
end
if user.is? :admin
  can :all, :location 
end

并检查它是否像你想要的那样工作。

答案 2 :(得分:0)

试试这个:

if user.is? :admin
  can :manage, :location
end

来自wiki

  

您可以传递:manage表示任何操作,并且:all表示任何对象。