如何将 Spatie 的 laravel-permission 与 JetStream 正确集成?

Arm*_*sik 7 laravel laravel-permission laravel-sanctum laravel-jetstream laravel-fortify

我在 Laravel 8 中很好地安装了 Laravel JetStream 和 Spatie 的 laravel-permission。

\n

我可以在注册过程中为用户分配角色

\n
$user->assignRole('visitor');\nreturn $user;\n
Run Code Online (Sandbox Code Playgroud)\n

并可以通过我在播种器 fil\xc3\xa9s run 方法中分配给角色的权限来限制用户仪表板上的可用菜单项:

\n
Permission::create(['name' => 'access profile']);\nPermission::create(['name' => 'access logout']);\n\n$visitor = Role::create(['name' => 'visitor']);\n$visitor->givePermissionTo('access profile');\n
Run Code Online (Sandbox Code Playgroud)\n

并通过视图中的 can 指令,例如:

\n
@can('access profile')\n<!-- Account Management -->\n<div class="block px-4 py-2 text-xs text-gray-400">\n    {{ __('Manage Account') }}\n</div>\n\n<x-jet-dropdown-link href="{{ route('profile.show') }}">\n    {{ __('Profile') }}\n</x-jet-dropdown-link>\n@endcan\n
Run Code Online (Sandbox Code Playgroud)\n

因此,我可以根据角色隐藏菜单项,但不幸的是,我仍然可以通过知道确切的 URL 直接访问该功能。

\n

我想我必须编写一个中间件来限制对某些功能的访问,但具体怎么做呢?

\n

在此堆栈中处理此问题的正确且可接受的方法是什么?

\n

谢谢!\nArmand\n所以一切看起来都很好,但是(!)

\n

如何禁止直接访问隐藏项目?我想在这种情况下,路由是由 sainttum 控制的,而角色和权限是由 Spatie 的包控制的。

\n

是否可以将两者联系起来?

\n

谢谢!

\n

小智 1

你尝试过这个吗?看来他们为 Spatie 添加了完全相同的内容。尽管如此,我认为你需要添加一个门权限检查,例如

abort_if(Gate::denies('permission'), Response::HTTP_FORBIDDEN, '403 Forbidden');
Run Code Online (Sandbox Code Playgroud)

在每一个行动上