2016-03-22 5 views
0

私は学校ベースのアプリケーションで重大な問題に遭遇しています。Admin、Student、Teacherの役割ベースのシステムのように設定したいと思います。私は認証のためにdeviseを使用し、認可のためにcancanを使用しました。事は私がどこから始めるべきではないかということです。私はdeviseユーザーモデルを追加し、フィールドロールを追加しました。私はロールベースの認可のためにthisに続いた。それは動作しますが、ドロップダウンで教師の役割を選択してStudent資格でログインしようとすると、決して役割を検証しません。それは学生としてログインします。選択したロールをログインフォームで検証したいと思います。ログイン役割による認証が有効でない

これまでのところ、ユーザーモデルをデバイスモデルとして使用しています。 には、Student Model、Teacher Model、およびAdmin Modelがあります。すべての生徒、教師、管理者はユーザーに属します。

Userモデルで

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 
関連する問題