问题描述
我想做一个中间件,如果一个用户如果他的角色是 1 进行身份验证,则自动将其重定向到管理面板,如果他的角色是 2,则自动将其重定向到学生面板。 我做了这个中间件,但是当我测试它时,我有“太多重定向”错误:
我的中间件代码:
if (auth()->check() && auth()->user()->role === 1){
return $next($request);
}else{
return redirect()->route('front.index');
}
我的路线:
我该如何解决这个问题?
解决方法
我遇到了同样的问题,并通过使用重定向和类似 Url 的重定向('/admin/login')来解决它。在 Laravel 应用中检查并尝试以下代码。
const obj = realm.objects('Shop').filtered("_id == $0 AND products._id == $1",ObjectId('60f73ca7c1a70278596cc7d0'),ObjectId('2'))
realm.write(() => {
realm.delete(obj)
})
或
if (auth()->check() && auth()->user()->role === 1){
return $next($request);
}else{
return redirect('/admin/login')->withErrors(['Access Denied']);
}
,
如果没有看到您的中间件,就很难确定问题所在,但您的其余代码看起来不错。尝试将您的中间件更改为如下所示:
public function handle(Request $request,Closure $next,string $roleName)
{
if (Auth::user()->isRole($roleName)) {
return $next($request);
}
abort(403);
}
我们正在将角色从路由传递到中间件,在您的情况下,您可能会传递 admin。因此,您的任何管理路由现在都将如下所示:
Route::middleware('checkRole:admin')->prefix('admin')->group(function () {
Route::get('/',[BackController::class 'index'])->name('admin.index')
});
您现在正在将字符串变量传递给中间件 $roleName
当然,您还需要在 isRole()
模型上实现 User.php
方法。这将类似于:
/**
* @return HasOne
*/
public function role(): HasOne
{
return $this->hasOne(Role::class,'id','role_id');
}
/**
* @return bool
*/
public function isRole($roleName): bool
{
$role = $this->role()->first();
if(!is_null($role) && $role->name == $roleName) {
return true;
}
return false;
}
我假设您的 role_id
模型上有一个 User.php
列,您有一个 Role.php
模型,其中 name
列将匹配 {{ 1}} 等,您在 admin
中也有 $routeMiddleware
,类似于 Kernel.php
在 Laravel 6/Laravel 8 中测试和工作
如果您想测试身份验证,我会更新您的路由中间件以获取一个数组,可能类似于:
'checkRole' => checkRole::class,
在我有 ['auth','checkRole:admin']
的地方,您需要角色路线图,例如:如果您是管理员 abort(403)