Laravel如何根据用户角色校验页面访问权限并重定向
轻量角色权限实现方案(无需第三方扩展包)
针对你只有两类角色、不需要复杂权限体系的场景,直接用Laravel自带的中间件+模型辅助方法就能实现,代码可直接复用:
- 第一步:在User模型中添加角色判断方法
打开app/Models/User.php,新增以下方法,后续全局都可以复用这个判断逻辑,不用每次硬编码角色值:
/** * 判断当前用户是否为管理员 * @return bool */ public function isAdmin() { return (int)$this->role === 1; }
- 第二步:创建自动校验权限的中间件
在项目根目录执行命令生成中间件文件:php artisan make:middleware AdminCheck
打开生成的app/Http/Middleware/AdminCheck.php,修改handle方法逻辑,实现访问前自动校验:
public function handle(Request $request, Closure $next) { // 未登录用户跳转登录页,已登录非管理员跳转至公开结果页 if (!auth()->check() || !auth()->user()->isAdmin()) { return redirect()->route('results')->with('tip', '无权访问管理员页面'); } return $next($request); }
- 第三步:注册中间件
打开app/Http/Kernel.php,在$routeMiddleware数组中添加中间件注册项:
protected $routeMiddleware = [ // 保留框架自带的其他中间件,新增下面一行 'admin' => \App\Http\Middleware\AdminCheck::class, ];
- 第四步:配置路由实现自动拦截
打开routes/web.php,按照页面访问权限分别配置路由即可,匹配你提到的两个页面场景:
// 对所有用户开放的比赛结果页,不需要加权限中间件 Route::get('/results', function () { return view('results'); })->name('results'); // 管理员专属路由组,统一套登录校验+管理员校验中间件 Route::middleware(['auth', 'admin'])->group(function () { // 管理员专属结果页,非管理员访问会被自动重定向 Route::get('/admin/RESULTSadmin', function () { return view('admin.RESULTSadmin'); })->name('admin.results'); // 后续新增其他管理员页面,直接写在这个分组内即可,自动继承权限校验逻辑 });
如果你只有极个别管理员页面、不想单独维护中间件,也可以直接在路由/控制器方法内写if判断实现拦截,逻辑完全一致:
Route::get('/admin/RESULTSadmin', function () { if (!auth()->user()?->isAdmin()) { return redirect('/results'); } return view('admin.RESULTSadmin'); });
- 额外:视图层的权限控制
如果需要在公共页面控制管理员专属入口的显示,直接用blade的@if判断即可:
@auth @if(auth()->user()->isAdmin()) <a href="{{ route('admin.results') }}">管理员结果管理入口</a> @endif @endauth
普通用户看不到管理员入口,就算手动输入管理员页面地址,也会被中间件自动拦截重定向,两层防护不会出现越权访问。
内容的提问来源于stack exchange,提问作者EBo
相关产品推荐
相关产品推荐

