Laravel-Jetstream(InertiaJS):在AppLayout.vue顶部菜单中使用权限守卫并添加管理员专属菜单项
如何通过权限守卫在顶部菜单添加管理员菜单项?
首先,我明白你已经掌握了在页面控制器中给Inertia视图传递权限守卫数据的方法(比如你给出的UsersController示例),但困惑于**AppLayout.vue对应的后端控制器在哪里**——毕竟要给顶部菜单加权限控制的管理员选项,得把权限数据传到这个全局布局里对吧?
其实Inertia的全局布局组件(比如AppLayout.vue)并不对应某个单独的后端控制器,它是前端用来复用的布局模板,被各个页面的Inertia视图引用。要给它传递全局权限数据,最常用的有两种靠谱的方式:
方式一:用Inertia的「共享数据」传递全局权限(最推荐)
因为顶部菜单的权限是所有页面都可能用到的全局数据,用Inertia的share方法把权限数据全局共享是最合理的做法:
- 打开你的
app/Providers/AppServiceProvider.php,在boot方法里添加共享逻辑:
use Inertia\Inertia; use Illuminate\Support\Facades\Auth; public function boot() { Inertia::share([ 'auth' => function () { return Auth::user() ? [ 'user' => [ 'id' => Auth::user()->id, 'name' => Auth::user()->name, // 这里定义全局需要的权限判断 'can' => [ 'view_admin_menu' => Auth::user()->can('admin.access'), 'manage_users' => Auth::user()->can('users.manage'), ], ], ] : null; }, ]); }
这样一来,所有Inertia视图(包括AppLayout.vue)都能直接访问这些权限数据了。
- 然后在
AppLayout.vue里,就可以根据权限判断是否渲染管理员菜单项:
<template> <div class="layout"> <!-- 顶部导航栏 --> <nav class="navbar"> <!-- 普通用户可见的菜单项 --> <router-link to="/dashboard">仪表盘</router-link> <router-link to="/profile">个人中心</router-link> <!-- 管理员专属菜单项,权限判断后渲染 --> <template v-if="$page.props.auth.user.can.view_admin_menu"> <router-link to="/admin">管理后台</router-link> <router-link to="/users">用户管理</router-link> </template> </nav> <!-- 页面内容插槽 --> <main class="content"> <slot /> </main> </div> </template>
方式二:在根控制器中全局注入权限数据
如果你的项目里有一个基础的根控制器(比如app/Http/Controllers/Controller.php,所有其他业务控制器都继承它),可以在这个根控制器的中间件里注入全局权限数据:
use Inertia\Inertia; use Illuminate\Support\Facades\Auth; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; public function __construct() { $this->middleware(function ($request, $next) { // 仅当用户登录时才传递权限数据 if (Auth::check()) { Inertia::share([ 'auth.user.can' => [ 'view_admin_menu' => Auth::user()->can('admin.access'), ], ]); } return $next($request); }); } }
这种方式也能让所有继承该根控制器的页面,在布局中拿到权限数据。
补充说明:为什么没有单独的AppLayout控制器?
Inertia的布局组件是前端层面的复用模板,它不需要对应后端的某个控制器——后端控制器负责渲染具体的页面视图,而页面视图会引用布局组件。所以全局的权限数据,用「共享数据」的方式是最贴合Inertia架构设计的方案。
内容的提问来源于stack exchange,提问作者Ben jamin
相关产品推荐
相关产品推荐

