laravel - 在 laravel 中使用中间件保护路由
问题描述
我有一个项目,它有两个部分“管理员”和“学生”。
我想制作一个中间件,如果一个通过身份验证的用户如果他的角色是 1 自动将其重定向到管理面板,如果他的角色是 2 自动将它重定向到学生面板。我做了这个中间件,但是当我测试它时,我有“Too Many Rediredcts”错误:
我的中间件代码:
if (auth()->check() && auth()->user()->role === 1){
return $next($request);
}else{
return redirect()->route('front.index');
}
我的路线:
我该如何解决这个问题?
解决方案
如果没有看到您的中间件,就很难确定问题所在,但您的其余代码看起来还不错。尝试将您的中间件更改为以下内容:
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
列的模型将匹配admin
等,并且您也有类似的$routeMiddleware
内容Kernel.php
'checkRole' => checkRole::class,
在 Laravel 6/Laravel 8 中测试和工作
如果您想测试身份验证,我会更新您的路由中间件以获取一个数组,可能类似于:
['auth', 'checkRole:admin']
在我拥有的地方abort(403)
,您需要一张到角色的路线图,例如:如果您是管理员return redirect()->route('admin.index')
推荐阅读
- c# - 无法解决此错误 Program.cs(14,33): 错误 CS0029: 无法将类型 'int' 隐式转换为 'char[]'
- scala - Sbt 包装脚本
- webstorm - WebStorm - 在每次提交之前删除 console.log
- python - python中是否有一个函数可以将散点图拟合到sin函数?
- javascript - 尝试将 Magicmouse.js 添加到自定义 wordpress 主题 - 无法加载
- php - 在 php Cpanel 中管道恢复电子邮件
- python - 在特定时间间隔内删除行
- c++ - 如何将小数规范化为范围内的值
- c# - 如何测试动态 JSON 文件中是否存在属性
- postgresql - plpgsql循环使用多行