我正在开发一个项目管理应用程序,在该应用程序中,我有project_managers和clients。我正在使用 Devise 和 CanCan 进行身份验证/授权。
登录后什么时候应该将用户重定向到他们自己的特定控制器/布局/视图?有没有办法根据他们是项目经理还是客户来检查current_user.role
并设置根(或重定向)?routes.rb
这是我可以在 Devise 的某个地方做出的改变吗?
提前感谢您的帮助! - 标记
我正在开发一个项目管理应用程序,在该应用程序中,我有project_managers和clients。我正在使用 Devise 和 CanCan 进行身份验证/授权。
登录后什么时候应该将用户重定向到他们自己的特定控制器/布局/视图?有没有办法根据他们是项目经理还是客户来检查current_user.role
并设置根(或重定向)?routes.rb
这是我可以在 Devise 的某个地方做出的改变吗?
提前感谢您的帮助! - 标记
您的routes.rb
文件不知道用户具有什么角色,因此您将无法使用它来分配特定的根路由。
你可以做的是设置一个控制器(例如,passthrough_controller.rb
),它反过来可以读取角色并重定向。像这样的东西:
# passthrough_controller.rb
class PassthroughController < ApplicationController
def index
path = case current_user.role
when 'project_manager'
some_path
when 'client'
some_other_path
else
# If you want to raise an exception or have a default root for users without roles
end
redirect_to path
end
end
# routes.rb
root :to => 'passthrough#index'
这样,所有用户都将拥有一个入口点,这反过来又根据他们的角色将他们重定向到适当的控制器/操作。
另一种选择是将 proc 传递给这样的authenticated
方法(我在此示例中使用 rolify):
authenticated :user, ->(u) { u.has_role?(:manager) } do
root to: "managers#index", as: :manager_root
end
authenticated :user, ->(u) { u.has_role?(:employee) } do
root to: "employees#index", as: :employee_root
end
root to: "landing_page#index"
请注意,在 Rails 4 中,您必须为每个根路由指定一个唯一名称,有关详细信息,请参阅此问题。
最简单的解决方案是使用lambda
:
root :to => 'project_managers#index', :constraints => lambda { |request| request.env['warden'].user.role == 'project_manager' }
root :to => 'clients#index'
我在使用 Warden 的 Rails 3 应用程序中执行此操作。由于 Devise 是建立在 Warden 之上的,我认为它会为您工作,但请务必在依赖它之前对其进行一些试验。
class ProjectManagerChecker
def self.matches?(request)
request.env['warden'].user.role == 'project_manager'
end
end
# routes.rb
get '/' => 'project_managers#index', :constraints => ProjectManagerChecker
get '/' => 'clients#index'
如果用户的角色是“project_manager”,则将使用 ProjectManagersController - 如果不是,将使用 ClientsController。如果他们根本没有登录,env['warden'].user
将为 nil 并且你会得到一个错误,所以你可能想要解决这个问题,但这会让你开始。
博客文章与实施http://minhajuddin.com/2011/10/24/how-to-change-the-rails-root-url-based-on-the-user-or-role/