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

时间:2014-12-19 21:05:36

标签: ruby-on-rails authentication devise roles

所以我一直在咀嚼这个问题几天,并且无法提出一个雄辩的解决方案。网上有一些资源,但它们不是很全面。 这是我的情况:

功能

  • 需要对三种不同用户类型进行身份验证的Rails应用 (管理员,经理,客户)
  • 他们的属性非常不同
  • 当他们登录时,他们会被视为截然不同的观点
  • 想维护一个登录表单
  • 每个用户类型仅限于自己的控制器及其操作
  • 客户可以通过主页注册自己
  • 只能从管理员门户
  • 创建管理员和管理员

目前,我在Devise中设置了User类,以及User和Admin,Manager,Client之间的多态关系。我尝试使用单个表继承,但由于每个用户类型具有不同的属性,我想避免使用具有许多空值的大型单个表。

提议的解决方案

  1. 多态关系。用户模型,具有管理员,经理和客户端 继承。这里的问题是如何限制每个模型 他们各自的控制员?

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

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

1 个答案:

答案 0 :(得分:0)

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