it-swarm-pt.tech

Alguém pode explicar Laravel 5.2 Multi Auth com Exemplo

Eu estou tentando autenticar users e admin formulário user tabela e admin tabela respectivamente. Eu estou usando o modelo User como fornecido pelo laravel fora da caixa e criei o mesmo para Admin. Eu adicionei uma chave de guarda e chave de provedor em auth.php. 

Guardas 

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

Provedores 

'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\[email protected]');
    Route::post('/admin/login','AdminAuth\[email protected]');
    Route::get('/admin/logout','AdminAuth\[email protected]');

    // Registration Routes.
    Route::get('admin/register', 'AdminAuth\[email protected]');
    Route::post('admin/register', 'AdminAuth\[email protected]');

    Route::get('/admin', '[email protected]');
});

Eu criei um diretório chamado AuthAdmin onde os arquivos AuthController.php e PasswordController.php padrão do Laravel estão presentes. (Namespace modificado em conformidade)

Em primeiro lugar, nos documentos do Laravel, mencionamos que como especificar uma proteção personalizada durante a autenticação, como essa, que não está funcionando.
enter image description here

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

enter image description here

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

159
imrealashu

Depois de muita escavação e muitas perguntas e respostas eu finalmente consegui trabalhar Laravel 5.2 Multi Auth com duas tabelas, Então estou escrevendo Resposta da minha própria pergunta. 

Como implementar o Multi Auth no Larvel 5.2

Conforme mencionado acima. Duas tabelas admin e users 

O Laravel 5.2 possui um novo comando artisan

php artisan make:auth 

ele gerará login/registrador básico route, view e controller para a tabela user

Crie uma tabela admin como users para simplificar. 

Controller For Admin
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(nota: eu copiei estes arquivos de app/Http/Controllers/Auth/AuthController aqui) 

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\[email protected]');
    Route::post('/admin/login','AdminAuth\[email protected]');
    Route::get('/admin/logout','AdminAuth\[email protected]');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\[email protected]');
    Route::post('admin/register', 'AdminAuth\[email protected]');

    Route::get('/admin', '[email protected]');

});  

AdminAuth/AuthController.php 

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

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

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

registre middleware em kernel.php 

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

use este 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 necessário para fazê-lo funcionar e também para obter json de uso autenticado de administração
Auth::guard('admin')->user() 

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

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

para logout 

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 Laravel 5.2 Implementado em Multiauth http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/

193
imrealashu

Caso isso ajude alguém, e isso pode ser devido à minha falta de compreensão do middleware, aqui está o que eu tive que fazer para que isso funcionasse (além dos passos dados pelo @imealashu) ...

Em route.php:

Route::get('/admin', [
  'middleware' => 'admin',
  'uses' => '[email protected]'
]);

Isso está no grupo de middleware web. Antes disso eu tentei colocá-lo em um grupo separado de middleware admin e até mesmo em um grupo auth:admin mas isso não funcionou, só funcionou para mim quando eu especifiquei o middleware como admin na própria rota. Eu não tenho idéia do porquê disso, mas espero que isso evite que os outros arranquem seus cabelos como eu fiz.

2
Sworrub Wehttam

É muito fácil em laravel 5.6. Basta ir para config/auth.php e adicionar esta linha na matriz providers:

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

Observe que usamos database para o driver não eloquent.

Agora adicione isso à matriz guards:

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

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

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

Felicidades.

0
Sky