2012-11-11 53 views
1

使用CanCan進行授權和設計進行身份驗證。我有三個角色。管理員角色可以訪問所有操作。但是當我以管理員身份登錄時,我仍然遇到Access Denied。我究竟做錯了什麼??我也一直在關注this wiki for implementationCanCan :: AccessDenied位置控制器#顯示所有角色

這是我的控制器代碼

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 

回答

1

用戶正確慘慘約定:

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

或者,你可以管理所有:

can :manage, :all 
+0

謝謝,工作;在某種方式。而之前它爲所有屬於所有角色的用戶顯示AccessDenied,現在每個人都可以通過!正如你從代碼中看到的,我希望role = titleclearing只能訪問title_clearing動作和role = acquisitions來獲取除title_clearing之外的所有動作。我該如何糾正這個問題? –

+0

我首先要確定user.is?將角色作爲符號返回,並且無線連接無論如何返回true。是:title_clearing他們可以執行的自定義操作?你有沒有把它放在你的代碼中?像「可以嗎? :title_clearing,位置 –

0

試試這個:

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

wiki

你可以通過:管理表示任何行動和:所有代表任何對象。

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 

並檢查它是否可以像你想要的那樣工作。