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.
Publicación del blog con la implementación http://minhajuddin.com/2011/10/24/how-to-change-the-rails-root-url-based-on-the-user-or-role/
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.