¿Alguien puede explicar Laravel 5.2 Multi Auth con un ejemplo?

172

Estoy tratando de autenticar a los usuarios y la tabla de formularios de administraciónuser y la admintabla respectivamente. Estoy usando el Usermodelo provisto por laravel fuera de la caja y creé el mismo porque Admin.he agregado una clave de protección y una clave de proveedor enauth.php.

Guardias

'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

Proveedores

'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],

Rutas

Route::group(['middleware' => ['web']], function () {
    // Login Routes.   
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes.
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');
});

He creado un directorio llamado AuthAdmindonde están presentes el valor predeterminado de Laravel AuthController.phpy los PasswordController.phparchivos. (Espacio de nombres modificado en consecuencia)

En primer lugar, en los documentos de Laravel se menciona que cómo especificar la protección personalizada mientras se autentica de esta manera, lo que no funciona.
ingrese la descripción de la imagen aquí

Hay otro método mencionado en los documentos de Laravel para usar un guardia que tampoco funciona.

ingrese la descripción de la imagen aquí

Sería beneficioso si alguien pudiera resolver los problemas y corregirme si me equivoco.

imrealashu
fuente
Laravel corrigió un error en la versión 5.2.6. protected $guard = 'guard_name'Se puede usar ahora.
imrealashu
En Laravel hay muchos paquetes generadores de paneles de administración disponibles. Prefiero Voyager Admin. Instalarlos fácil y brisa. Puede ahorrarle toneladas de código. Solo necesitas entender cómo funciona. No reinventes la rueda. Voyager - The Missing Laravel Admin Una aplicación de Laravel con la plantilla de administración de arranque de Gentelella.
sathish R

Respuestas:

201

Después de muchas excavaciones y muchas preguntas y respuestas, finalmente logré trabajar Laravel 5.2 Multi Auth con dos tablas, así que estoy escribiendo Respuesta de mi propia pregunta.

Cómo implementar Multi Auth en Larvel 5.2

Como se ha mencionado más arriba. Dos mesa adminyusers

Laravel 5.2 tiene un nuevo artisancomando.

php artisan make:auth

generará conectar / registrarse básica route, viewy controllerde usermesa.

Haga una admintabla como userstabla para simplificar.

Controller For Admin
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(nota: acabo de copiar estos archivos desde app/Http/Controllers/Auth/AuthControlleraquí)

config/auth.php

//Authenticating guards
'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

//User Providers
'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],  

//Resetting Password  
'passwords' => [
    'clients' => [
        'provider' => 'client',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'admins' => [
        'provider' => 'admin',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],  

route.php

Route::group(['middleware' => ['web']], function () {
    //Login Routes...
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');

});  

AdminAuth/AuthController.php

Agregue dos métodos y especifique $redirectToy$guard

protected $redirectTo = '/admin';
protected $guard = 'admin';
public function showLoginForm()
{
    if (view()->exists('auth.authenticate')) {
        return view('auth.authenticate');
    }

    return view('admin.auth.login');
}
public function showRegistrationForm()
{
    return view('admin.auth.register');
}  

te ayudará a abrir otro formulario de inicio de sesión para administrador

creando un middleware para admin

class RedirectIfNotAdmin
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @param  string|null  $guard
 * @return mixed
 */
public function handle($request, Closure $next, $guard = 'admin')
{
    if (!Auth::guard($guard)->check()) {
        return redirect('/');
    }

    return $next($request);
}

}

registrar middleware en kernel.php

 protected $routeMiddleware = [
    'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
];

use este middleware en AdminController , por ejemplo,

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{
    public function __construct(){
        $this->middleware('admin');
   }
public function index(){
        return view('admin.dashboard');
    }
}

Todo eso es necesario para que funcione y también para obtener json de uso de administrador autenticado
Auth::guard('admin')->user()

Editar - 1
Podemos acceder al usuario autenticado directamente usando,
Auth::user() pero si tiene dos tablas de autenticación, entonces debe usar

Auth::guard('guard_name')->user()  

para cerrar sesión

Auth::guard('guard_name')->user()->logout()

para el usuario autenticado json

Auth::guard('guard_name')->user()  

Editar 2

Ahora puede descargar el proyecto implementado Laravel 5.2 Multiauth http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/

imrealashu
fuente
muchas gracias hombre, esto era lo que estaba buscando, funcionó con un poco de modificación. muchas gracias +1 por Q y +1 por Ans, ojalá pudiera +1 más. muchas gracias ..
rummykhan 02 de
@imrealashu, como he creado el proyecto según su respuesta. Pero genera un error de múltiples clases con el mismo nombre. ¿Y qué hay de eso? Si cambio el nombre de la clase para la autenticación de administrador, ¿dónde debo hacer los cambios?
Akshay Vaghasiya
1
¿podría explicar también cómo "Restablecer contraseña" para la protección de administrador?
Shoaib Rehan
1
Gracias por la excelente explicación, fue muy útil para mí todo. Para usar el invitado de middleware, cambie el archivo RedirectIfAuthenticated.php en la siguiente línea: Original: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } después del cambio: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Cristian Meza
1
@Jeffz es solo por la mala documentación y no hay ejemplos de trabajo en autenticación múltiple ... esperamos una buena documentación y sí, las nuevas características interesantes en esta actualización 5.3.
imrealashu
2

En caso de que esto ayude a alguien, y esto puede deberse a mi falta de comprensión del middleware, esto es lo que tuve que hacer para que esto funcionara (además de los pasos tomados por @imrealashu) ...

En route.php:

Route::get('/admin', [
  'middleware' => 'admin',
  'uses' => 'AdminController@index'
]);

Esto está en el webgrupo de middleware. Antes de esto, intenté ponerlo en un admingrupo de middleware separado e incluso en un auth:admingrupo, pero esto no funcionó, solo funcionó para mí cuando especifiqué el middleware como administrador en la ruta misma. No tengo idea de por qué esto es así, pero espero que evite que otros se quiten el cabello como lo hice yo.

Sworrub Wehttam
fuente
Descargué su archivo zip de autenticación múltiple reemplazado por archivos de proyecto ezisting y luego cuando migro mi base de datos este error muestra ... [Symfony \ Component \ Console \ Exception \ RuntimeException] No hay suficientes argumentos (falta: "nombre").
G Naga Subrahmanyam
En realidad, para mí, el administrador está iniciando sesión pero no se lo redirige a administrador. Después de hacer esto funciona, ¿puedes decir por qué? Tengo que registrar otras rutas, ya que es posible Route::group(['middleware' => ['admin']], function () { //Admin Routes... });porque no me funciona
Leap Hawk
0

Es muy fácil en laravel 5.6. Simplemente vaya config/auth.phpy agregue esta línea en la providersmatriz:

'admins' => [
   'driver' => 'database',
   'table' => 'admin_table'
]

Tenga en cuenta que utilizamos databasepara el controlador no eloquent.

Ahora agregue esto a la guardsmatriz:

'admin_guard' => [
   'driver' => 'session',
   'provider' => 'admins'
]

Ahora hemos terminado! Use esto cuando trabaje con la tabla de administradores:

Auth::guard('admin_guard')->User();

Salud.

Cielo
fuente