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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在中间件上做了一些更改,Laravel重定向次数太多次才能登录相关的知识,希望对你有一定的参考价值。

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

<?php

    namespace AppHttpMiddleware;
    use IlluminateSupportFacadesAuth;
    use AppModelsEnrollment;

    use Closure;

    class adminAuth
    {
        /**
         * Handle an incoming request.
         *
         * @param  IlluminateHttpRequest  $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重定向到登录页面,但是会有单独的中间件将用户重定向。向登录用户显示登录页面有什么意义?但是当第二次重定向发生时,它再次触发你的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');
    }
}

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

以上是关于我在中间件上做了一些更改,Laravel重定向次数太多次才能登录的主要内容,如果未能解决你的问题,请参考以下文章

如果在 Laravel 5.3 中通过身份验证,则重定向

成功操作后不会重定向到相同的分页(或页面)。 Laravel

Laravel:以不同方式重定向不同的用户角色

Laravel 7:重定向到不同警卫的不同登录名

验证后避免 Laravel 重定向

维护模式与中间件在 Laravel 中重定向