美文网首页
Laravel-ACL 权限继承

Laravel-ACL 权限继承

作者: 伍源辉 | 来源:发表于2017-01-19 16:31 被阅读47次

通过权限继承,可以达到一次过绑定多个权限的效果。

为什么需要继承?

某些情况下,同一个权限在不同的角色下有不同的方法。例如一个 clientadmin rolemanager 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.

下面使用 TeacherStudent 角色来作为演示。

首先创建角色

        $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.studentinternships 继承权限之后,我们可以忘掉 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());

相关文章

  • Laravel-ACL 权限继承

    通过权限继承,可以达到一次过绑定多个权限的效果。 为什么需要继承? 某些情况下,同一个权限在不同的角色下有不同的方...

  • Laravel-ACL 获取权限

    获取角色权限 获取用户权限 获取用户的权限,用户权限和角色权限会以键值对数组的形式一起返回。同时用户权限会覆盖角色...

  • Laravel-ACL 权限相关操作

    创建权限 给角色分配权限 提醒: 你可以传入对象、数组、permission->id 或者只传入 name。 一次...

  • 继承

    继承的方式 class默认继承权限:privatestruct默认继承权限:public 赋值兼容规则----pu...

  • Laravel-ACL 验证权限和角色

    验证角色 可以通过调用 is 方法验证角色。 基于用户的验证。 Laravel 5.3 使用 hasRole() ...

  • Laravel-ACL 用户-权限相关操作

    用户权限的工作方式和角色权限一样,除了用户权限会覆盖默认的角色权限。 为权限集合设置的别名会以 json 的形式存...

  • Zookeeper的认证方式

    Zookeeper对权限的控制是节点级别的,而且不继承,即对父节点设置权限,其子节点不继承父节点的权限。Zooke...

  • C++继承,静态成员,const成员

    继承 继承的方式有三种 公共继承 保护继承 私有继承 访问权限publicprotectedprivate对本类可...

  • C++继承和派生

    C++通过继承关系,实现了代码的可重用性。 public表示继承方式,也表示访问权限 一、继承方式和访问权限的影响...

  • rest_framework 权限

    rest framework 如何实现权限 1.首先需要创建权限类,可以继承 rest framework 的基础...

网友评论

      本文标题:Laravel-ACL 权限继承

      本文链接:https://www.haomeiwen.com/subject/uxfzvttx.html