php - software - Laravel 5.0 multiauth
laravel tutorial (5)
Laravel no proporciona sesiones mixtas. Solo puede autenticarse como un usuario a la vez. Si realmente necesita este tipo de funcionalidad en Laravel 5.0, podría resolverlo mediante el ping-pong de usuario hackish (por ejemplo, iniciar sesión temporalmente como cliente y volver a administrar inmediatamente después).
Pero parece que su problema es más relacionado con la Authorization
(en contraste con la Authentication
). Laravel implementó una capa de autorización en v5.1.11. Como v5.0 ya no es compatible, debe actualizar independientemente de esta característica.
Puede encontrar más información sobre la autorización en la documentación oficial: https://laravel.com/docs/5.1/authorization
Tengo una aplicación que tiene dos partes back-end y front-end. En el programa de fondo, el administrador puede iniciar sesión y, en el front-end, el cliente puede iniciar sesión. Ahora se ha implementado. La consulta de todas las aplicaciones se realiza mediante la identificación de usuario registrada tanto en el administrador como en el cliente.
Ahora mi aplicación necesita una funcionalidad en la que el administrador pueda ver los datos del cliente de la misma manera que el cliente vea su perfil. Hay muchas cosas en el extremo del cliente. Puedo usar Auth::loginUsingId($client_id)
. Aquí el perfil del cliente se muestra perfectamente, pero la sesión de inicio de sesión de administrador se pierde como se esperaba.
¿Cómo lograr esto mientras el acceso de administrador permanece y el administrador puede ver datos completos del cliente?
Creo que una buena forma de administrar los perfiles de cliente / usuario es implementar una sección de administración de usuarios en su back-end, mostrar y editar allí sus usuarios y sus perfiles.
Prefiero sugerir que separe la lógica de la vista, por ejemplo, la lógica empresarial, en una capa común en lugar de una funcionalidad de "inicio de sesión como cliente". Aunque parezca un atajo, tendrás muchas cosas en qué pensar.
Por ejemplo, ¿cómo registra eventos de aplicaciones ahora? ¿Agregar un cheque donde la sesión tenga adm_id
y registrarlo en vez de userId
? Esto es sólo un ejemplo.
Lo que hubiera hecho:
Separe la vista (por ejemplo, perfiles de usuario, contenido de usuario, etc.) de la sesión para que se acceda por la ID en la URL o cualquier otro método, no por el ID de usuario actualmente conectado.
Implemente una ACL adecuada basada en roles . Ya hay muchos paquetes . En su ejemplo, usted debe tener un rol de
admin
y un rol declient
, ambos con permiso de objetoview-client-profile
, por ejemplo.
Al final, esto podría tomar mucho más tiempo para el desarrollo, pero sin duda podría ahorrarle tiempo de depuración / solución de problemas con el cliente enojado por teléfono. Espero que ayude.
Permítanme presentar la forma más sencilla de tener el login as client
funcionalidad del login as client
. Primero, defina las rutas asuser
y returnback
.
Rutas y acciones
Route::get(''/asuser/{user}'', ''AdminController@asuser'')
->where(''user'', ''[0-9]+'')
->name(''asuser'');
Route::get(''/returnback'', ''ClientController@returnback'')
->name(''returnback'');
En el controlador del administrador:
public function asuser(User $client, Request $request) {
/* insert checking if user has right either here with some field
* like $user->is_admin or using middleware settings and Policy
*/
# who user is
$fromId = Auth::user()->getId();
# logging as a client
Auth::login($client, true);
# but keeping admin in a session
$request->session()->put(''adm_id'', $fromId);
return redirect()->route(''some-client-route'')
->with(''status'', ''You are logged in as a client'');
}
Y para regresar a ClientController
public function returnback(Request $request) {
$fromId = Auth::user()->getId();
# getting admin id
$admId = $request->session()->pull(''adm_id'');
$adminUser = User::find($admId);
if (!$adminUser) {
return redirect()->back()
->with(''status'', ''Not allowed'');
}
# logging out as a client and logging in as admin
Auth::logout();
Auth::login($adminUser, true);
return redirect()->route(''some-admin-route'')
->with(''status'', ''Welcome back!'');
}
¿Está listo para la producción?
No, no es. Esa no es una gran solución, es solo un vistazo a cómo usarla. Las sesiones tienen vigencia, por lo que si el administrador no vuelve durante su vida útil, las variables de sesión se pierden y se convierte en un cliente (si remember me
= verdadero, como en el código anterior). Puede almacenar el valor no en una sesión sino en una columna de base de datos.
Además, como se menciona en el t1gor, debe prestar atención al hecho de que no puede registrar las acciones del cliente y enviar eventos cuando el administrador es un cliente. Ese es el problema más serio de la registración como cliente. De todos modos, supongo, es más fácil resolver eso, que mover toda la lógica de autenticación fuera de las vistas.
Bueno, espero que sea útil.
Creo que el middleware es la mejor opción para filtrar el contenido entre el administrador y el usuario normal, porque el código en el middleware se ejecuta antes de cualquier llamada de función.
Solo necesita establecer el tipo de uso en la sesión y filtrar en consecuencia.