ruby-on-rails authentication routes devise cancan

ruby on rails - ¿Cómo puedo redirigir la ruta de inicio(raíz) de un usuario en función de su rol usando Devise?



ruby-on-rails authentication (5)

La solución más simple es usar lambda :

root :to => ''project_managers#index'', :constraints => lambda { |request| request.env[''warden''].user.role == ''project_manager'' } root :to => ''clients#index''

Estoy trabajando en una aplicación de gestión de proyectos, y en la aplicación, tengo project_managers y clientes . Estoy usando Devise y CanCan para autenticación / autorización.

¿En qué momento después del inicio de sesión debería redirigir al usuario a su propio controlador / diseño / vistas específicos? ¿Hay alguna manera de verificar current_user.role en routes.rb y establecer la raíz (o redirigir) en función de si son un administrador de proyecto o un cliente? ¿Es esto un cambio que puedo hacer en Devise en alguna parte?

¡Gracias de antemano por cualquier ayuda! --Marca


Lo hago en una aplicación de Rails 3 que usa Warden. Dado que Devise está construido sobre Warden, creo que funcionará para ti, pero asegúrate de experimentarlo un poco antes de confiar en él.

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''

Si la función del usuario es "project_manager", se utilizará ProjectManagersController; si no es así, se usará ClientController. Si no han iniciado sesión, el env[''warden''].user Será nulo y obtendrá un error, por lo que probablemente querrá evitarlo, pero esto lo ayudará a comenzar.


Otra opción es pasar un proceso al método authenticated como este (estoy usando rolify en este ejemplo):

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"

Tenga en cuenta que en Rails 4 debe especificar un nombre único para cada ruta raíz, consulte este problema para obtener detalles.



Su archivo routes.rb no tendrá idea de qué función tiene el usuario, por lo que no podrá usarlo para asignar rutas raíz específicas.

Lo que puede hacer es configurar un controlador (por ejemplo, passthrough_controller.rb ) que a su vez puede leer el rol y redirigir. Algo como esto:

# 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''

De esta forma, todos los usuarios tendrán un punto de entrada, que a su vez los redireccionará al controlador / acción apropiado dependiendo de su rol.