2016-03-22 19 views
0

Okul tabanlı uygulamada ciddi bir sorun yaşıyorum, Yönetici, Öğrenci ve Öğretmen için rol tabanlı sistem gibi kurmak istiyorum. Kimlik doğrulama için yetki kullanmış ve yetkilendirme için kanister kullanmıştım. Mesele şu ki, başlamak için yer yok. Kullanıcı modelini ekledim ve bir alan rolü ekledim. Rol tabanlı yetkilendirme için this'u takip ettim. Çalışıyor, ancak açılır menüde bir Öğretmen rolü seçerek Öğrenci kimlik bilgisiyle oturum açmaya çalıştığımda, hiçbir zaman rolleri doğrulamıyor (asla sizin için böyle bir şey reddedildiğini söylemiyor). Bir öğrenci olarak giriş yapar. Giriş formunda seçilen rolleri doğrulamak istiyorum.login Doğrulama yoluyla roller doğrulanmadı

Şu an için kullanıcı modelini model modeli olarak kullanıyorum. ve , Öğrenci Modeline, Öğretmen Modeline ve Yönetici Modeline sahiptir. ve tüm Öğrenci, Öğretmen ve yönetici Kullanıcıya aittir. Benim vasiyet kaydı görünümünde

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

Yoksa Kullanıcı modeline

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 

yılında

Bütün Öğrenci, Öğretmen ve Yönetici için vasiyetle modelini kullanmak istiyorsunuz? eğer evet bunu nasıl tamamlarım? Herhangi bir yardım veya öneriniz size yardımcı olur. Şimdiden teşekkürler.

cevap

0

Belirli bir rol kullanıcısını, form açılır listesinde seçili rolle oturum açmak için doğrulamak istiyorsanız, oturum açma biçiminde seçilen kullanıcı adı bilgileriyle oturum açma oturumunda seçilen rol için Oturumlar Oturum Açma/Oturum Açma yöntemini özelleştirmeniz gerekir. ve oyuna girişi için bir hata uyarı göndermek ve kullanıcı önlemek

örnek bir seans # yöntem olacaktır oluşturun:.

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