如何解决Laravel中用惯用的方式来管理具有字段级特定性的权限
我是Laravel的新手,我想通过RESTFUL API使数据库中的数据可用。我需要使用字段级别的特异性来控制数据对象的权限。我很好奇Laravel中惯用的方式是什么?
例如,我将有一个名为PrintMachine
的数据库表,该表具有字段Id,MachineName,ActivityStatus,ManufacturingYear
。我要分配以下权限:
- Web管理员获得对
PrintMachine
中所有记录和所有字段的读取和编辑访问权限 - 工厂经理可以获得对所有记录的
PrintMachine.MachineName and PrintMachine.ActivityStatus
字段的读取和编辑访问权限,而对PrintMachine
中的任何其他字段都没有访问权限。 - 底层操作员对所有记录的
PrintMachine.MachineName
字段都具有读取权限,而对PrintMachine
中的任何其他字段都没有权限。
人们告诉我考虑Spatie Module并同时阅读Gates and Policies,但尚不清楚这两个人如何独自获得字段级权限。
我正在考虑的另一种选择是通过以下方式自定义创建自己的解决方案:
- 对于GET请求,创建三个名为
PrintMachineAdmin,PrintMachineManager,PrintMachineOperator
的ViewModel,每个类都具有可通过相应角色访问的属性。 - 对于POST / PUT请求,我必须编写自己的条件语句以根据用户角色验证数据
是否有一种更惯用的方法来开发用于宁静API的字段级权限的功能?
解决方法
很多选择。角色和权限结构的实现可以实现这一点,您可以肯定通过Spatie模块来实现。
例如,改编自Spatie文档:
$role = Role::create(['name' => 'Manager']); //db has roles table
//or if already created
//$role = Role::where('name','Manager')->first();
$permission = Permission::create(['name' => 'edit PrintMachine.MachineName']); //db permissions table
$role->givePermissionTo($permission); //now manager role has been assigned permission to edit machine name.
//assigning role to user
$user = User::create(['name'=> 'Manager User']); //or get existing
$user->assigneRole($role); //now this user has edit access to machine name
//to see if user has access
if( $user->hasPermissionTo('edit PrintMachine.MachineName') )
//do efit
//OR if you want to check using role
if( $user->hasRole('Manager')
//do manager stuff
//and in view you can use @can blade directive
@can( 'edit PrintMachine.MachineName' )
//authenticated user can edit machine name //show edit button/form
@endcan
//similarly @role directive will do the check using role
对于使用AuthServiceProvider
的{{1}}方法的超级管理员。
boot
Gate的Gate::before(function ($user,$ability) {
return $user->hasRole('Super Admin') ? true : null;
});
方法在所有其他gate操作之前,因此在这里可以覆盖所有其他权限。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。