Ruby on rails 我如何正确设置Rails 4 Desive身份验证,使用三种不同的用户类型和每种类型的不同授权?

Ruby on rails 我如何正确设置Rails 4 Desive身份验证,使用三种不同的用户类型和每种类型的不同授权?,ruby-on-rails,authentication,devise,roles,Ruby On Rails,Authentication,Devise,Roles,所以我已经思考这个问题好几天了,没能想出一个有说服力的解决方案。网上有一些资源,但不是很全面。 以下是我的情况: 规格 需要对三种不同用户类型进行身份验证的Rails应用程序 管理员、经理、客户 它们有非常不同的属性 当他们登录时,他们会看到非常不同的观点 想要维护一个单一的登录表单吗 每个用户类型仅限于其自己的控制器及其操作 客户可以通过主页注册 管理员和管理员只能从管理员门户创建 目前,我已经设计了一个用户类,以及用户和管理员、经理、客户机之间的多态关系。我尝试使用单表继承,但由于每个用户类

所以我已经思考这个问题好几天了,没能想出一个有说服力的解决方案。网上有一些资源,但不是很全面。 以下是我的情况:

规格

需要对三种不同用户类型进行身份验证的Rails应用程序 管理员、经理、客户 它们有非常不同的属性 当他们登录时,他们会看到非常不同的观点 想要维护一个单一的登录表单吗 每个用户类型仅限于其自己的控制器及其操作 客户可以通过主页注册 管理员和管理员只能从管理员门户创建 目前,我已经设计了一个用户类,以及用户和管理员、经理、客户机之间的多态关系。我尝试使用单表继承,但由于每个用户类型都有不同的属性,因此我希望避免使用包含许多空值的大型单表

提议的解决办法

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

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


在这两种解决方案中,哪一种更具可扩展性、更干净、更安全?如果有其他关于通用应用程序架构的建议,那会更好吗?谢谢

这就是我如何在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