2016-03-22 192 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