Laravel登录重定向了你太多次

时间:2016-06-14 19:08:35

标签: laravel laravel-5.1 laravel-5.2 laravel-routing

我一直在努力解决这个问题,我现在正在尝试将未登录用户的所有网址重定向到登录页面,它给了我这个错误,我肯定是因为它是在/ login URL上创建一个循环。身份验证也是在登录页面中检查授权用户。但是我希望在检查auth时登录页面应该是一个例外。我可能做错了,我无法得到。这是我的代码。

routes.php文件

Route::post('login', 'Auth\AuthController@login');
Route::get('login' , 'Auth\AuthController@showLoginForm');
Route::get('/'     , 'Auth\AuthController@showLoginForm');

kernel.php

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Auth\Access\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'acl' => \App\Http\Middleware\CheckPermission::class,
];

验证课程

class Authenticate
{
    public function handle($request, Closure $next, $guard = null) {    
      if (Auth::guard($guard)->guest()) {
        if ($request->ajax() || $request->wantsJson()) {
            return response('Unauthorized.', 401);
        } else {
            return redirect()->guest('login');
        }
      }
    return $next($request);
    }
}

AuthController类

class AuthController extends Controller {

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;
    protected $redirectTo = '/dashboard';
    protected $loginPath = '/login';
    protected $redirectPath = '/dashboard';
public function __construct(){
    $this->middleware('auth', ['except' =>'login']); 
    /* I have been trying these many things to fix this, all in loss.
    // $this->middleware('acl'); // To all methods
    // $this->middleware('acl', ['only' => ['create', 'update']]); 
    // $this->middleware('guest', ['only' => ['/login']]);
    // echo "Message"; exit;
    // $this->middleware('auth');
    // $this->middleware('auth', ['only' => ['login']]);
    // $this->middleware('auth', ['only' => ['/login']]);
    // $this->middleware('auth', ['except' => 'login']);
    // $this->middleware('guest');
    // $this->middleware('guest', ['only' => ['logout' , 'login', '/login', '/']]);
}

请帮助我,这一切都在我的头上,对我来说似乎是某种火箭科学。好顺便说一下,我是laravel的新手,可能会做一些愚蠢的事情,为此道歉。在此先感谢。

5 个答案:

答案 0 :(得分:3)

您需要在Laravel组外添加路由登录:

<强> routes.php文件

Route::auth();

Route::group(['middleware' => 'auth'], function () {
  // All route your need authenticated
});

另外,您可以使用以下方式查看您的路线列表:

php artisan route:list

答案 1 :(得分:1)

为什么要这样做只是为了将每个未登录的用户重定向到登录表单?

我认为你可以这样做

<强> routes.php文件

  Route::post('login', 'Auth\AuthController@login');
  Route::get('login' , 'Auth\AuthController@showLoginForm');
  Route::get('/'     , 'Auth\AuthController@showLoginForm');

Route::group(['middleware' => 'auth'], function () {

    // any route here will only be accessible for logged in users
 });

和auth controller构造应该是这样的

AuthController

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

答案 2 :(得分:1)

问题出在您的路线上。

当我进入并且我没有退出时,您将我发送到登录(获取)路线。当您在AuthController中的构造函数中指定中间件时,每次调用AuthController的方法时,都会再次调用构造函数并在登录时将其发回...并且它会无限重复。

答案 3 :(得分:0)

喜欢@mkmnstr说

  

问题出在您的路线上。   当我进入并且我没有退出时,你发送给我登录(获取)路线。当您在AuthController中的构造函数中指定中间件时,每次调用AuthController的方法时,都会再次调用构造函数并在登录时将其发回...并且它会无限重复。

修复你应该添加

Auth::logout();

下面

...
} else {
  Auth::logout(); // user must logout before redirect them
  return redirect()->guest('login');
}
...

答案 4 :(得分:0)

如果使用自定义中间件,则必须遵循所有规则 就我而言,我必须在Web中间件组中定义一个自定义路由类。 在复制粘贴的世界中,有时我们会犯错误。

中间件

pkill -USR1 trap-test.sh; pkill -USR1 trap-test.sh

我在Kernel.php中的错误
如果存在于Web $ middlewareGroups中的自定义中间件类将检查条件2次,那么它将给出错误,例如:重定向您太​​多次


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

        if(!isset(session('user'))){
            return redirect('login');
        }

        return $next($request);
    }
}