2016-07-24 35 views
-1

我試圖使用cancancan禁止訪問非會員的註冊頁面。只有成員應該能夠創建新成員。我通過ability.rb來定義,但我不知道如何禁止sign_up操作。這是我試圖至今:Cancancan不允許設計sign_up操作

if user.has_role? :admin 
else 
    can :sign_in, User 
    cannot :sign_up, User 
    cannot :sign_up, Registration 
    cannot :create, User 
    cannot :create, Registration 
end 

而我依然能看到註冊頁面,而不登錄我應該做到這一點一些其他的方式?或者我做錯了什麼?

感謝

+0

cancancan能力刪減只定義角色。你需要檢查他們是否允許訪問。你有沒有在註冊頁面控制器上做任何檢查? – infiniteRefactor

+0

不,我沒有那個控制器,可能Devise有。我需要以某種方式覆蓋它嗎? –

回答

1

由於@infiniteRefactor指出,CanCanCan基於角色的訪問限制。另一方面,用戶是否登錄是狀態問題(用戶可以登錄或註銷,而不考慮角色)。幸運的是,你已經在使用Devise了。

你可以用Devise的user_signed_in?輔助方法得到你想要的。

您可以通過添加以下代碼,無論大家認爲你想隱藏隱藏你的註冊視圖:

<% if !(user_signed_in?) %> 
    <%= redirect_to new_user_registration_path %> 
<% else %> 
    <!-- The rest of the view's code goes here --> 
<% end %> 

然後,爲了防止實際行動當用戶沒有登錄,請確定您正在使用:

before_action :authenticate_user! 

在您的控制器中。

+0

我沒有提到我也在使用rolify來檢查並設置角色給用戶。基本思想是不是每個用戶都被允許添加用戶。所以,雖然我明白你在說什麼,但我也沒有基於角色的解決方案。最好來自我用來設置其他cancancan規則的相同能力模型。 –

0

因此,您正在嘗試使用Devise的註冊頁面,並且僅限訪問成員。

設計只做身份驗證。它不知道cancancan能力或您可能引入的任何其他用戶邏輯。因此,你想要的東西不會失效。

您需要公開控制器並覆蓋註冊控制器。您可以使用

rails generate devise:controllers users 

如果你的色器件用戶模式是users。請參閱設計文檔以獲得實際的命令參考。然後您可以自定義註冊控制器。

我希望在這裏做的是使用能力和身份驗證檢查作爲控制器操作。

class Devise::RegistrationsController < DeviseController 
    ... 
    before_action :authenticate_user! 
    load_and_authorize_resource 

但是你可以做任何你想做的事情。這是你想要限制訪問的部分。您可以涉及rolify或應用程序的任何其他組件。

這基本上就是你要求的。但是,我會推薦而不是採取這種方式。

我和我正在進行的項目有過類似的經歷。我試圖構建一個基於管理員的添加用戶頁面,並嘗試使用設計註冊頁面作爲基礎並對其進行修改。

但是我所經歷的是定製這些控制器,並且當您開始更改頁面的實際動態時,視圖(特別是控制器)越來越麻煩。您可能會發現自己越來越深入,以確保整個身份驗證模型無任何問題地運行。

相反,我所做的就是介紹我自己的控制器。由於devise公開了身份驗證模型和方法,因此執行標準任務(例如添加,刪除和更新用戶)相當容易。你的控制器將是非常微不足道的,事實上,對於cancancan來說,使用load_and_authorize_resource來編寫一個可以自動處理資源操作的框架控制器(沒有方法體)就足夠了。

您可以複製設計的視圖並使用此控制器。這樣你可以提供一個類似的設計前端體驗。

這種方法最重要的優點是您不需要擴展設計並將其作爲組件工作。因此,任何會在您的項目或設計中發生變化的東西都不會對您造成太大影響。