Laravel Backpack:如何通过权限控制特定插件访问并返回403
无权限访问预定义插件时返回403的实现方案
针对无法修改预定义插件(如LangFileManager、PermissionManager)的路由、中间件或使用crud->denyAccess()的场景,可通过以下两种方式实现权限校验并返回403:
方案一:全局中间件拦截请求
通过自定义全局中间件,拦截目标插件的请求并验证权限:
- 创建中间件
php artisan make:middleware CheckPluginAccess
- 编写权限校验逻辑
在app/Http/Middleware/CheckPluginAccess.php的handle方法中添加:
public function handle(Request $request, Closure $next) { // 定义需要管控的插件路由前缀 $protectedPlugins = ['langfilemanager', 'permissionmanager']; $currentPrefix = trim($request->route()->getPrefix(), '/'); if (in_array($currentPrefix, $protectedPlugins)) { $requiredPermission = "use {$currentPrefix}"; if (!auth()->user()?->can($requiredPermission)) { abort(403, '无访问权限'); } } return $next($request); }
- 注册全局中间件
在app/Http/Kernel.php的$middleware数组中添加该中间件:
protected $middleware = [ // ... 已有的全局中间件 \App\Http\Middleware\CheckPluginAccess::class, ];
方案二:监听路由匹配事件(Backpack专属)
如果基于Backpack框架,可通过监听路由匹配事件,精准识别插件控制器并校验权限:
- 注册事件监听
在app/Providers/EventServiceProvider.php的$listen数组中添加:
protected $listen = [ \Illuminate\Routing\Events\RouteMatched::class => [ \App\Listeners\CheckPluginRouteAccess::class, ], ];
- 创建监听类
php artisan make:listener CheckPluginRouteAccess
- 编写校验逻辑
在app/Listeners/CheckPluginRouteAccess.php的handle方法中添加:
public function handle(\Illuminate\Routing\Events\RouteMatched $event) { $routeAction = $event->route->getAction(); $protectedNamespaces = [ 'Backpack\LangFileManager\Http\Controllers', 'Backpack\PermissionManager\Http\Controllers' ]; if (in_array($routeAction['namespace'] ?? '', $protectedNamespaces)) { // 从命名空间提取插件名称生成权限标识 $pluginName = strtolower(end(explode('\\', $routeAction['namespace']))); $requiredPermission = "use " . str_replace('controllers', '', $pluginName); if (!auth()->user()?->can($requiredPermission)) { abort(403); } } }
额外优化:隐藏侧边栏入口
若需同时隐藏插件在侧边栏的入口,可在Backpack的视图文件中通过权限指令控制:
@can('use langfilemanager') <li class="nav-item"><a class="nav-link" href="{{ backpack_url('langfile') }}">语言文件管理</a></li> @endcan @can('use permissionmanager') <li class="nav-item"><a class="nav-link" href="{{ backpack_url('permission') }}">权限管理</a></li> @endcan
注意:需确保权限系统中已创建
use langfilemanager、use permissionmanager这类权限,并正确分配给对应角色/用户。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

