我在Laravel 8中安装了Laravel JetStream和Spatie的Laravel权限。
我可以通过在注册期间为用户分配角色
$user->assignRole('visitor');
return $user;
并且可以通过我在种子文件运行方法中分配给角色的权限来限制用户面板上的可用菜单项
Permission::create(['name' => 'access profile']);
Permission::create(['name' => 'access logout']);
$visitor = Role::create(['name' => 'visitor']);
$visitor->givePermissionTo('access profile');
并通过视图中的can指令,如:
@can('access profile')
<!-- Account Management -->
<div class="block px-4 py-2 text-xs text-gray-400">
{{ __('Manage Account') }}
</div>
<x-jet-dropdown-link href="{{ route('profile.show') }}">
{{ __('Profile') }}
</x-jet-dropdown-link>
@endcan
因此,我可以根据角色隐藏菜单项,但不幸的是,通过知道确切的URL,我仍然可以直接访问该功能。
我想我必须编写一个中间件来限制对某些功能的访问,但具体是怎么写的呢?
在这个堆栈中,处理这个问题的正确和可接受的方法是什么?
谢谢!Armand所以一切看起来都很好,但是(!(
如何可能禁止直接访问隐藏的项目?我想在这种情况下,路由由圣地控制,而角色和权限由Spatie的包控制。
有可能把两者联系起来吗?
谢谢!
你试过这个吗?他们似乎为斯帕蒂添加了完全相同的内容。尽管如此,我认为你需要添加一个像一样的登机口权限检查
abort_if(Gate::denies('permission'), Response::HTTP_FORBIDDEN, '403 Forbidden');
每次行动
我想看看您是否可以使用laravel内置的can
中间件。然后您就可以更新您的路线定义了。类似的东西
Route::get('/profile', 'ProfileController@index')->middleware('can:access profile');
我还没有对您使用的软件包进行此操作,但我认为如果其他内置功能(如blade@can
(正常工作,它应该会正常工作。