Laravel - problema de redirecionamento não autenticado com autenticação de múltiplos

votos
2

Eu tenho um sistema de autenticação de múltiplos criada em Laravel 5,7

Há uma seção de 'admin' do site e uma seção 'aluno' do site. Quando você tenta acessar uma parte de qualquer site, ele redireciona a página de login correto se você não está logado ainda.

No entanto, se seguir estes passos, me deparo com um problema com os redirecionamentos:

  1. Tento acessar uma parte (não o login) do site 'admin', que me redireciona para o login de administrador.
  2. Então, se eu ligar diretamente para a seção de login da página 'aluno' e entrar, em vez de ir para a página inicial que irá redirecionar-me de volta para o login de administrador.

-Lo corretamente me faz logon, mas incorretamente redireciona para outra página de login. O problema também acontece vice-versa, se eu conseguir um redirecionamento automático para o 'aluno', em seguida, ligar diretamente para a página de login de administrador e faça o login.

Eu acredito que eu já reduzi a questão baixo para a função unaunthenticated Eu coloquei no arquivo / Handler.php exceção, mas eu não consigo descobrir onde ir a partir daí.

protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
        $guard = array_get($exception->guards(), 0);
        switch ($guard) {
            case 'learner':
                $login = 'learner.login';
                break;
            default:
                $login = 'login';
                break;
        }
        return redirect()->guest(route($login));
    }

Usando cada página de login separado funciona bem. É só quando você segue o processo acima que vejo problemas.

Eu uso middleware separado em cada controlador como este:

Admin Início Controlador

public function __construct()
    {
        $this->middleware('auth');
    }

controlador de login admin:

public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

controlador de casa Learner

public function __construct()
    {
        $this->middleware('auth:learner');

    }

Controlador de login do aluno:

public function __construct()
    {
        $this->middleware('guest:learner')->except('logout');
    }

Solução: limpar o url pretende com Session: esquecer ( 'url.intended');

protected function unauthenticated($request, AuthenticationException $exception)
    {
        // dd($exception);
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
        $guard = array_get($exception->guards(), 0);
        switch ($guard) {
            case 'learner':
                $login = 'learner.login';
                break;
            default:
                $login = 'login';
                break;
        }
        Session::forget('url.intented'); 
        return redirect()->route($login);
    }
Publicado 20/09/2018 em 04:08
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Solução: limpar o url pretende com Session: esquecer ( 'url.intended');

protected function unauthenticated($request, AuthenticationException $exception)
    {
        // dd($exception);
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
        $guard = array_get($exception->guards(), 0);
        switch ($guard) {
            case 'learner':
                $login = 'learner.login';
                break;
            default:
                $login = 'login';
                break;
        }
        Session::forget('url.intented'); 
        return redirect()->route($login);
    }
Respondeu 21/09/2018 em 06:04
fonte usuário

votos
0

Aqui está um exemplo do que eu uso na produção de um aplicativo que tem duas classes de usuário que ambos devem ser registrados em acesso seus recursos separados. A classe de usuário usa o padrão de autenticação Laravel sem alterações, no entanto, meus usuários class Admin usar este middleware personalizado:

<?php

namespace App\Http\Middleware;

use App\Admin;
use Closure;
use Illuminate\Support\Facades\Auth;

class AdminMiddleware
{

    public function handle($request, Closure $next)
    {
        if (Auth::guest()) {
            return redirect(route('admin.login'));
        }

        if (!$request->user() instanceof Admin) {
            return redirect(route('restricted'));
        }
        return $next($request);
    }
}

I registrou o AdminMiddleware na app/Http/Kernel.phpassim:

protected $routeMiddleware = [
    'admin' => \App\Http\Middleware\AdminMiddleware::class,

    /*** OTHER MIDDLEWARES ARE HERE ***/
];

No routes/web.phparquivo eu ter embrulhado as rotas assim:

Route::group(['prefix' => 'admin', 'as' => 'admin.', 'middleware' => 'auth:admin'], function () {
    /**** ADMIN ROUTES ARE HERE ****/
});

Route::group(['middleware' => 'auth'], function () {
    /**** CLIENT ROUTES ARE HERE ****/
});

E eu tenho um AdminLoginController costume que substitui um a $redirectvariável de caminho, bem como as guard(), showLoginForm()e redirectTo()funções e se parece com isso:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;

class AdminLoginController extends Controller
{

    use AuthenticatesUsers;

    protected $redirectTo = '/admin/home';

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    } 

    public function guard()
    {
        return Auth::guard('admin');
    }

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

    public function redirectTo()
    {
        return route('admin.home');
    }

}

Finalmente, no config/auth.phpque tenho as seguintes referências aos guardas, fornecedores e senhas:

'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

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

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],


'providers' => [

    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],

    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ], 

],

'passwords' => [
    'admin' => [
        'provider' => 'admins',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'users' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],

Claro que isso significa que meus Administradores e usuários são armazenados em tabelas separadas no banco de dados, mas funciona muito bem sem quaisquer problemas, então estou perfeitamente bem com isso.

Respondeu 20/09/2018 em 20:21
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more