2010-01-25 164 views
2

我爲我的應用程序使用了CanCan授權插件(http://github.com/ryanb/cancan),至今爲止效果很好。我把它設置如下:Rails CanCan身份驗證問題

class Ability 
    include CanCan::Ability 

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

    if user.role == "admin" 
     can :manage, :all 
    else 
     can :read, :all 


    end 
    end 
end 

這使我可以指定一些用戶管理員,只有他們可以訪問寫功能。現在我想再走一步,使其完全沒有登錄(current_user/user_session不存在)的人無法訪問站點的某些控制器。我知道它應該是某種elsif,用戶的代碼中間部分和其他人的最後部分。但是,我還沒有找到最好的方法來設置這個。是否有人熟悉CanCan並對如何最好地處理這種類型的情況有一些想法。

謝謝你們,每一點都可以幫助我更全面地瞭解rails和開發!

回答

4

我對CanCan不太熟悉,但是這種邏輯屬於特定的控制器。這是我如何做的摘錄。我相信你明白了,可以將它抽象到CanCan上。

class ItemsController < ApplicationController 
    before_filter :login_required 
    # or if you only want to restrict it to some actions etc 
    # before_filter :login_required, :except => [:show] 
    # or 
    # before_filter :login_required, :only => [:edit] 
end 

class ApplicationController < ActionController::Base 
    protected 
    def login_required 
     access_denied! unless current_user.logged_in? 
    end 
end 

CanCan是授權不認證。有一個區別;)

+0

好的,非常感謝你,我想我是在想這個問題。我仍然可以使用CanCan來處理更復雜的管理邏輯,然後僅使用您爲頁面編寫的內容,而不管是否有人登錄。非常感謝! – user258480 2010-01-25 17:02:53

+0

如果這個答案對你來說足夠了,你應該用你的問題標記爲我的帖子左側的鏈接。 – 2010-01-25 19:07:23

0

我不知道你是否仍在尋找這個答案,但它並不難。所有你需要的是一個客人用戶的錯誤條件。在你的其他塊中,放上類似 可以:show,Controller do | controller | user.id.present? 結束

如果用戶的客人,這將是假的,因爲它沒有被保存,因此沒有訪問。 如果它是一個登錄用戶,它將是真實的,所以他們將獲得訪問權限。

0

也許你可以這樣做:

def initialize(user) 
    if user.role?("admin") 
     can :manage, :all 
    elsif user.role?("sales member") 
     can :manage, Request 
    elsif user.role?("sales admin") 
     can :manage, Request 
     can :manage, SpecialOffer 
    else 
     cannot :manage, :all 
    end 
    end 

而不是放:所有的,只是把模型(如請求,SpecialOffer)的名稱。

How to implement the dynamic authorization with CanCan?