通过权限继承,可以达到一次过绑定多个权限的效果。
为什么需要继承?
某些情况下,同一个权限在不同的角色下有不同的方法。例如一个 client
在 admin role
和 manager role
下拥有不同的权限。如果我们不使用继承,我们需要将大量的验证捆绑在一起: Auth::user()->can('view.client.as.manager|view.client.as.admin|view.client.as.webdev|...')
,并且每个类型的角色都需要这样列出来。为了使它变得更简便,我们可以使用权限继承。我们只需要使用 Auth::user()->can('view.client')
进行权限验证,这样做就简单多了。因此,一个名为 client
的单独的权限就可以在管理员或者其他角色下正常工作了。
通过代码来说明吧。
提醒: The example below will only work as expected with 'ntfs' => false set in the config/acl.php file. By default, this value is set to true, so update accordingly if this is how you want the permission inheritance to work.
下面使用 Teacher
和 Student
角色来作为演示。
首先创建角色
$roleTeacher = Role::create([
'name' => 'Teacher',
'slug' => 'teacher',
'description' => 'Teacher [...]'
]);
$roleStudent = Role::create([
'name' => 'Student',
'slug' => 'student',
'description' => 'Student [...]'
]);
然后为老师和学生创建权限
$permissionInternship = Permission::create([
'name' => 'internships',
'slug' => [ // an array of permissions.
'create' => true,
'view' => true,
'update' => true,
'delete' => true,
],
'description' => 'manage internships'
]);
$permissionStudent = Permission::create([
'name' => 'internships.student',
'slug' => [ // an array of permissions only for student
'create' => false,
],
// 使用权限继承
'inherit_id' => $permissionInternship->getKey(),
'description' => 'student internship permissions'
]);
提醒:
inherit_id
在 internships.student 里。
当internships.student
从internships
继承权限之后,我们可以忘掉internships.student
,因为我们将它作为了internships
。
所以 getPermissions 会返回 array('internships' => [...合并了 internships.student 的权限...])
将权限分配给新创建的角色
$roleTeacher->assignPermission('internships');
// 或者 assignPermission($permissionInternship->id)
$roleStudent->assignPermission('internships.student');
然后将角色分配给用户
$user->assignRole($roleTeacher);
$user->assignRole($roleStudent);
//$user->revokeRole('teacher');
最后,做一些测试
// 用户拥有老师和学生角色
dump($user->can('create.internships')); // results true
// 用户拥有老师角色
dump($user->can('create.internships')); // results true
// 用户拥有学生角色
dump($user->can('create.internships')); // results false
dump($user->getPermissions());