我在中间件上做了一些更改,Laravel重定向次数太多次才能登录

时间:2018-03-02 16:32:46

标签: laravel authentication redirect laravel-middleware laravel-5.6

这是我的中间件代码。如果角色不等于1,我想将用户重定向到登录页面。以下代码出了什么问题?

<?php

    namespace App\Http\Middleware;
    use Illuminate\Support\Facades\Auth;
    use App\Models\Enrollment;

    use Closure;

    class adminAuth
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
         public function handle($request, Closure $next, $guard = null)
         {
               //if the logined user role is equal to 1, the user should continue
             if (Auth::guard($guard)->check() && Auth::user()->role == 1) {
               return $next($request);
              }
              else
              {
                  //otherwise redirect the user to login
                  return redirect('/login');
              }


         }
    }

1 个答案:

答案 0 :(得分:0)

我认为问题在于您尝试将登录用户的角色不是1重定向到登录页面,但是会有单独的中间件将用户重定向。向登录用户显示登录页面有什么意义?但是当第二次重定向发生时,它再次触发你的adminAuth中间件,这将导致无限重定向循环。

问题是,您将身份验证与授权混合。检查用户是否已登录是身份验证。检查登录用户可以执行的操作是授权。

如果只有角色为1的用户(我猜某种管理员角色),那么您应该向具有任何其他角色的用户显示“禁止访问”页面:

class VerifyUserIsAdministrator
{
    public function handle($request, $next)
    {
        if ($request->user()->role == 1) {
            return $next($request);
        }

        abort(403, 'User is not an administrator');
    }
}

另外,考虑一种检查角色的更好方法。角色的整数1对于使用您的代码的新人来说没有任何意义。如果角色1 是管理员,那么可以在User模型上创建一个方法,然后使用它:

class User extends Authenticatable
{
    public function isAdministrator()
    {
        return $this->role == 1;
    }
}
class VerifyUserIsAdministrator
{
    public function handle()
    {
        if ($request->user()->isAdministrator()) {
            return $next($request);
        }

        abort(403, 'User is not an administrator');
    }
}

请注意中间件中的逻辑如何变得更具可读性?