2016-03-22 245 views
0

我對基於學校的應用程序存在嚴重問題,我想爲管理員,學生和教師設置基於角色的系統。我已經使用設計進行身份驗證,並可以對授權進行掃描。事情是我不會從哪裏開始。我添加了設計用戶模型並添加了一個字段角色。我遵循this的基於角色的授權。它可以工作,但是當我嘗試通過在下拉列表中選擇一個教師角色來登錄學生證書時,它永遠不會驗證角色(絕不會說您的訪問被拒絕)。它以學生身份登錄。我想驗證登錄表單中選定的角色。登錄通過角色進行身份驗證無法驗證

現在我正在使用用戶模型作爲設計模型。和 有學生模型,教師模型和管理模型。所有學生,教師和管理員都屬於用戶。

在用戶模式

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
    has_many :admins 
    has_many :students 
    has_many :teachers 
    ROLES = %i[admin teacher student] 
end 

在我色器件登記觀點

<%= f.collection_select(:role, User::ROLES, :to_s, lambda{|i| i.to_s.humanize}) %> 

要不然我想用色器件模型對所有學生,教師和管理?如果是,我該如何完成。任何幫助或建議都很有幫助。提前致謝。

回答

0

如果要驗證特定角色用戶使用在表單下拉列表中選擇的角色進行登錄,那麼您必須爲登錄表單中選定的角色定製登錄方法SessionsController#Create,其中用戶憑證來自表單併發送錯誤警告,避免用戶得到登錄

樣本會話#創建方法是:

def create 
self.resource = warden.authenticate!(auth_options) 
if resource.role == params[:role] 
    set_flash_message!(:notice, :signed_in) 
    sign_in(resource_name, resource) 
    yield resource if block_given? 
    respond_with resource, location: after_sign_in_path_for(resource) 
else 
    set_flash_message!(:error, "UnAuthorized Access!") 
    redirect_to root_path 
end 
end