我在中间件上做了一些更改,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重定向次数太多次才能登录的主要内容,如果未能解决你的问题,请参考以下文章