Alguém pode explicar a autenticação múltipla do Laravel 5.2 com exemplo


171

Eu estou tentando autenticar usuários e tabela de formulário de administradoruser e admintabela, respectivamente. Estou usando o Usermodelo fornecido pelo laravel e criei o mesmo, pois Admin.adicionei uma chave de guarda e uma chave de provedor noauth.php.

Guardas

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

Fornecedores

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

Rotas

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');
});

Eu criei um diretório chamado AuthAdminonde os arquivos AuthController.phpe o padrão do Laravel PasswordController.phpestão presentes. (Namespace modificado de acordo)

Antes de tudo, nos documentos do Laravel mencionamos como especificar a guarda personalizada enquanto se autentica como esta, que não está funcionando.
insira a descrição da imagem aqui

Há outro método mencionado nos documentos do Laravel para usar um guarda que também não está funcionando.

insira a descrição da imagem aqui

Seria benéfico se alguém pudesse resolver os problemas e me corrigir se eu estiver errado.


O Laravel corrigiu um erro na versão 5.2.6. protected $guard = 'guard_name'pode ser usado agora.
precisa saber é o seguinte

No Laravel, existem muitos pacotes de geradores do painel do administrador disponíveis. Eu prefiro o Voyager Admin. Instalá-los fácil e fácil. Isso pode economizar muito código. Você só precisa entender como isso funciona. Não reinvente a roda. Voyager - The Missing Laravel Admin Um aplicativo Laravel com Gentelella bootstrap admin tempalte.
precisa

Respostas:


201

Depois de muita pesquisa e muitas perguntas e respostas, finalmente consegui trabalhar com o Laravel 5.2 Multi Auth com duas tabelas, então estou escrevendo a resposta da minha própria pergunta.

Como implementar o Multi Auth no Larvel 5.2

Como acima mencionado. Duas mesa admineusers

O Laravel 5.2 tem um novo artisancomando.

php artisan make:auth

ele irá gerar básica login / registo route, viewe controllerpara a usermesa.

Faça uma adminmesa como usersmesa para simplificar.

Controller For Admin
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(nota: acabei de copiar esses arquivos app/Http/Controllers/Auth/AuthControllerdaqui)

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

Adicione dois métodos e especifique $redirectToe$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');
}  

isso ajudará você a abrir outro formulário de login para administrador

criando um 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 em kernel.php

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

use esse middleware em AdminController , por exemplo,

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');
    }
}

Isso é tudo o que é necessário para fazê-lo funcionar e também para obter o json do uso de administrador autenticado
Auth::guard('admin')->user()

Editar - 1
Podemos acessar o usuário autenticado diretamente usando,
Auth::user() mas se você tiver duas tabelas de autenticação, precisará usar

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

para sair

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

para usuário autenticado json

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

Editar 2

Agora você pode fazer o download do Projeto implementado em Laravel 5.2 Multiauth http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/


muito obrigado cara, era isso que eu estava procurando, funcionou com um pouco de modificação. muito obrigado +1 por Q e +1 por Ans, gostaria de poder marcar mais +1. muito obrigado ..
rummykhan 02/02

@ imrealashu, como eu criei o projeto conforme sua resposta. Mas gera erro de várias classes com o mesmo nome. E daí? Se eu alterar o nome da classe para autenticação de administrador, onde preciso fazer alterações?
Akshay Vaghasiya

1
Você também pode explicar como "Redefinir senha" para o administrador.
precisa saber é o seguinte

1
Obrigado pela excelente explicação foi muito útil para mim tudo. Para usar o convidado do middleware, altere o arquivo RedirectIfAuthenticated.php da seguinte linha: Original: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } Após a alteração: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Cristian Meza

1
@ Jeffff é apenas por causa de documentação ruim e nenhum exemplo de trabalho em multi-autenticação .. esperamos uma boa documentação e sim os novos recursos interessantes nesta atualização 5.3.
imrealashu

2

Caso isso ajude alguém, e isso pode ser devido à minha falta de entendimento do middleware, aqui está o que eu tenho que fazer para que isso funcione (além das etapas executadas por @imrealashu) ...

Em route.php:

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

Este está no webgrupo de middleware. Antes disso, tentei colocá-lo em um admingrupo de middleware separado e até em um auth:admingrupo, mas isso não funcionou, só funcionou para mim quando especifiquei o middleware como administrador na própria rota. Não faço ideia do porquê, mas espero que isso evite que outros arrancem os cabelos, como eu fiz.


Fiz o download do seu arquivo zip de autenticação múltipla substituído por arquivos de projeto ezisting e, quando migro meu banco de dados, esse erro é exibido. [Symfony \ Component \ Console \ Exception \ RuntimeException] Argumentos insuficientes (faltando: "nome").
G Naga Subrahmanyam

Na verdade, para mim, o administrador está fazendo login, mas não é redirecionado para o administrador. Depois de fazer isso, você pode dizer por que é isso? Eu tenho que registar outras rotas como é possível com Route::group(['middleware' => ['admin']], function () { //Admin Routes... });causa não está trabalhando para mim
Leap Falcão

0

É muito fácil no laravel 5.6. Basta ir config/auth.phpe adicionar esta linha na providersmatriz:

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

Observe que usamos o databasedriver não eloquent.

Agora adicione isso ao guardsarray:

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

Agora terminamos! Use isso ao trabalhar com a tabela de administradores:

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

Felicidades.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.