2011-08-11 47 views
18

因爲任何人都可以註冊並登錄,並且因爲用戶在登錄後才能識別角色,所以跳過authorization_check for Devise沒有意義嗎?cancan skip_authorization_check設計身份驗證

在這個前提下,我使用這個registrations_controller繼承了Devise註冊控制器並將其放置在控制器目錄中。

class Users::RegistrationsController < Devise::RegistrationsController 
    skip_authorization_check 
end 

改變路線文件:

devise_for :users, :controllers => { :registrations => "registrations" } 

我失去了一些東西,但:

This action failed the check_authorization because it does not authorize_resource. Add skip_authorization_check to bypass this check. 

感謝您的幫助。

+0

@RyanBigg明確的康康舞文檔,當我得到過去的這個問題,我要去看看,如果你的答案到前面的問題是應用程序的正確答案。謝謝。 – Jay

+0

@Hosemeyer,我需要先解決這個問題,然後才能在其他問題中遵循您的建議。謝謝你的幫助。 – Jay

回答

38

最簡單的辦法

check_authorization :unless => :devise_controller? 

如果你有手動將check_authorization在每個控制器在某些時候你會忘記,在你的應用程序打開一個安全漏洞。最好明確白名單控制器,不需要cancan授權。

這是在

https://github.com/ryanb/cancan/wiki/Ensure-Authorization

編輯

class ApplicationController < ActionController::Base 
    check_authorization :unless => :do_not_check_authorization? 
    private 
    def do_not_check_authorization? 
    respond_to?(:devise_controller?) or 
    condition_one? or 
    condition_two? 
    end 

    def condition_one? 
    ... 
    end 

    def condition_two? 
    ... 
    end 
end 
+0

感謝bradgonesurfing +1。當我回來修改和測試這段代碼時,如果一切順利,我會改變接受的答案。 – Jay

+0

答案仍然是Bigg先生,他的得分是(-1) – bradgonesurfing

+0

問題我有,除了設計控制器,還有兩個其他控制器,我想跳過。我一直無法修改'除非'條件來添加這些。我可以在其中添加'skip_authorization_check',但如果應用程序中只有一個位置處理所有異常,則會更好。 – Jay