7
respostas

Laravel 5.5 não está autorizando pelo método de login explicado

Meu código sempre cai no redirect para o Login...

No meu caso o Autorizador ficou assim...

<?php
namespace App\Http\Middleware;
use Closure;
class Autorizador
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(!$request->is('loginNovo') && \Auth::guest()) {
             return redirect('/loginNovo');
        }
        return $next($request);
    }
}

Adicionei ao kernel ...

protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\Autorizador::class,
    ];

form_login.blade.php

@extends('layout.principal')
@section('conteudo')
@if($errors->all())
<div class="alert alert-danger">
    <ul>
    @foreach($errors->all() as $error)
        <li> {{$error}} </li>
    @endforeach
    </ul>
</div>
@endif
<h1>Login no Sistema</h1>
<form action="/loginNovo" method="post">
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    <div class="form-group">
        <label>E-mail: </label>
        <input type="email" class="form-control" name="email" value="{{old('email')}}" />
    </div>
    <div class="form-group">
        <label>Senha: </label>
        <input type="password" class="form-control" name="password" />
    </div>
    <button class="btn btn-primary btn-block" type="submit">Logar</button>
</form>
@stop

LoginController

<?php
namespace App\Http\Controllers;
use Request;
use Auth;
class LoginController extends Controller {
    public function form() {
        return view('login.form_login');
    }
    public function login() {
        $credenciais = Request::only('email', 'password');
        if(Auth::attempt($credenciais)) {
            return 'Usuário está logado com sucesso!';
        }
        return 'Usuário não existe ou não tem acesso!';
    }
}

Alguém saberia o porque?

7 respostas

Onde você configurou pra dizer para o framework que ele tem que usar esse middleware? Geralmente se faz isso no arquivo de rotas ou nos arquivos de controller. Você fez isso?

Olá Tarcísio, bom pelo que eu entendi, ao colocar o Middleware no Kernel, com a regra...

   if(!$request->is('auth/login') && \Auth::guest()) {
        return redirect('/auth/login');
    }
    return $next($request);

Sempre que eu não estiver logado, vou ser redirecionado para /auth/login, não importa para qual método de qual controller eu fizer a requisição... a não ser que eu faça para o próprio auth/login.

Isso também vale no Laravel 5.5?

Pelo que eu vi na documentação sim. Tenta colocar um dd ai nesse método pra ver se ele ta sendo chamado. Já testou?

Olá Tarcísio, por fim configurei a autenticação pelo próprio esquema do Laravel

Estou fazendo no 5.4 e mesmo problema aqui...

public function handle($request, Closure $next)
    {
        if(!$request->is('loginNovo') && \Auth::guest()) {
             return redirect('/loginNovo');
        }
        return $next($request);
    }

Aparentemente \Auth::guest() está sempre sendo analisado para true.

Dando uma fuçada, o que parece que está acontecendo é que o a classe Auth não está sendo referênciada de maneira correta.

Para funcionar dessa forma, fiz o seguinte, no arquivo Kernel, a lista $middleware ficou assim:

protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Cookie\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \estoque\Http\Middleware\VerifyCsrfToken::class,
        \estoque\Http\Middleware\Autorizador::class,
    ];

Semelhante ao que é utilizado na versão do Laravel do curso.

Mesmo problema aqui, estou usando a versão 5.5. do Laravel e no route.php (que no Laravel 5.5 é o web.php) não dá certo ativar ou copiar o código que viria padrão na versão do curso:

Route::get('home', 'HomeController@index');

Route::controllers([
    'auth' => 'Auth\AuthController',
    'password' => 'Auth\PasswordController',
]);

Daí não consigo sair da lógica do login onde sempre dá o resultado "O usuário não existe"

No Autorizador.php está assim:

<?php

namespace estoque\Http\Middleware;

use Closure;
use Auth;

class Autorizador
{

    public function handle($request, Closure $next)
    {

        if( !$request->is('login') && \Auth::guest() ){
            return redirect('/login');
        }

        return $next($request);
    }
}

E no LoginController.php assim:

<?php

namespace estoque\Http\Controllers;

use estoque\Http\Requests;
use estoque\Http\Controllers\Controller;

use Request;
use Auth;

class LoginController extends Controller
{

    public function autentica(){

        return view('login.form_login');

    }

    public function login(){

        $credenciais = Request::only('email', 'password');

        if(Auth::attempt($credenciais)){
            return 'Logado com sucesso';
        }

        return 'Usuário não existe';

    }

}

Eu estou utilizando o Laravel 5.5 e estava com este problema.

No meu caso a resolução foi a seguinte:

Adicionar a seguinte linha na lista $middleware no arquivo kernel:

\Illuminate\Session\Middleware\StartSession::class,