如何正确设置具有三种不同用户类型和每种类型不同授权的 Rails 4 Devise 身份验证?

Posted

技术标签:

【中文标题】如何正确设置具有三种不同用户类型和每种类型不同授权的 Rails 4 Devise 身份验证?【英文标题】:How can I properly set up Rails 4 Devise authentication with three different user types and different authorizations for each type? 【发布时间】:2015-02-18 20:26:10 【问题描述】:

所以我这几天一直在研究这个问题,但无法想出一个雄辩的解决方案。网上有一些资源,但不是很全面。 这是我的情况:

规格

需要对三种不同用户类型进行身份验证的 Rails 应用程序 (管理员、经理、客户) 它们有非常不同的属性 当他们登录时,他们会看到截然不同的视图 希望维护一个登录表单 每种用户类型都仅限于自己的控制器及其操作 客户可以通过首页自行注册 只能从管理员门户创建管理员和经理

目前,我已经设置了一个 User 类,以及 User 和 Admin、Manager、Client 之间的多态关系。我尝试使用单表继承,但由于每个用户类型都有不同的属性,我希望避免使用包含许多空值的大型单表。

建议的解决方案

    多态关系。用户模型,包含管理员、经理和客户 继承。这里的问题是如何将每个模型限制为 他们各自的控制者?

    用户模型,具有 has_one 关系 使用 ClientProfile 和 ManagerProfile 来处理额外的 属性。然后使用 declarative_authorization 或 CanCanCan 来 限制授权。这有助于保持应用程序干燥,只保留 一个用户模型,但视图逻辑变得复杂。

在这两种解决方案中,哪一种看起来更具可扩展性、简洁和安全?如果对通用应用程序架构有任何其他建议会更好?谢谢!

【问题讨论】:

【参考方案1】:

这就是我在 ROR 上设置多个用户类型的应用程序的方式

#config/routes.rb
AppName::Application.routes.draw do
    devise_for :users, :controllers => 
    registrations: 'users/registrations',
    :sessions => "users/sessions",
    :passwords => 'users/passwords',
    :confirmations => 'users/confirmations'
  

  authenticate :user do
    namespace :users do
      ....
      get '/' => 'dashboards#index'
      root :to => 'dashboards#index'
    end
  end

  devise_for :admins, :controllers => 
    :sessions => "admins/sessions",
    :passwords => 'admins/passwords',
    :confirmations => 'admins/confirmations'
  

  authenticate :admin do
    namespace :admins do
      ....
      get '/dashboard' => 'dashboards#index
      root :to => 'dashboards#index'
    end
  end
  root 'pages#index'
end

现在你已经有了你的路由,你可以创建你的控制器

我有

#app/controllers/user_controller.rb
class UserController < ApplicationController
  before_filter :authenticate_user!
  layout 'users/default'
  before_filter :check_user_active

  private
  def check_user_active
    unless current_user.active
      flash[:notice]= t(:user_not_active)
      sign_out current_user
      redirect_to new_user_session_path
    end
  end
end



# app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
  layout 'users/login'

   def create

  end

  def destroy
  end
end

最后但并非最不重要的是意见

只需将所有内容都放在其名称空间中,例如 #app/views/users/sessions/new.html.haml

【讨论】:

以上是关于如何正确设置具有三种不同用户类型和每种类型不同授权的 Rails 4 Devise 身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据用户类型重定向到特定的布局页面?

如何在 JSprit 中使用具有自身成本矩阵的车辆类型

Django中不同的用户级别

具有Spring Security的多个用户

对于具有不同类型控件的单个视图,我是不是需要多个控制器?

我可以为每种不同类型的继承类拥有不同的静态变量副本吗