这是我的中间件代码。如果角色不等于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');
}
}
}
答案 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');
}
}
请注意中间件中的逻辑如何变得更具可读性?