6

我在 Laravel 8 中有一个很好的基本安装 Laravel JetStream 和 Spatie 的 laravel-permission。

我可以在注册期间为用户分配一个角色

$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 直接访问该功能。

我想我必须编写一个中间件来限制对某些功能的访问,但究竟如何呢?

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

谢谢!阿尔芒所以一切看起来都很好但是(!)

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

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

谢谢!

4

2 回答 2

1

你试过这个吗?似乎他们为 Spatie 添加了完全相同的内容。不过,我认为您需要添加一个门权限检查,例如

abort_if(Gate::denies('permission'), Response::HTTP_FORBIDDEN, '403 Forbidden');

在每一个动作

于 2021-08-30T13:42:15.233 回答
0

我会看看你是否可以利用 laravel 的内置can中间件。然后,您也许可以更新您的路线定义。就像是

Route::get('/profile', 'ProfileController@index')->middleware('can:access profile');

我没有对您正在使用的软件包执行此操作,但我认为如果刀片等其他内置功能正常工作,它应该可以@can工作。

于 2022-01-12T21:47:03.143 回答