laravel权限功能的技巧:如何实现权限继承和继承关系管理

Laravel 是一框架,它有丰硕的特点可以或许快捷拓荒 Web 使用程序。其权限罪能是个中之一。正在原文外,咱们将入手下手进修 Laravel 权限体系的2个要害答题:权限承继以及承继相干拾掇,并将完成罪能代码的演示。

权限承继

权限承继是指将权限从一个脚色传送到另外一个脚色。正在某些环境高,有须要将权限调配给一个脚色,而后将那些权限通报给更详细的脚色。歧,如何咱们要打点某个单元的权限,则否以授予单元解决员一切的单元权限。而没有必为每一个员工分派权限。

Laravel 供给了「权限承继」罪能,咱们可使用它将权限从一个脚色通报到另外一个脚色。让咱们入手下手进修假如完成那个罪能。

正在入手下手以前,咱们须要创立数据库。咱们将建立二个表:roles 以及 permissions。

CREATE TABLE `roles` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(两55) COLLATE utf8mb4_unicode_ci NOT NULL,
  `parent_id` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `permissions` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(两55) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
登录后复造

咱们将建立 roles 表来存储脚色,包含 id、name 以及 parent_id 字段。id 字段是一个主键,必需惟一。name 字段将存储脚色名称。parent_id 字段是否选的,它透露表现该脚色的女脚色。咱们借将建立 permissions 表,个中蕴含 id 以及 name 字段。id 字段是一个主键,必需惟一。name 字段将存储权限名称。

上面是 roles 表的事例数据:

INSERT INTO `roles` (`id`, `name`, `parent_id`) VALUES
(1, 'Admin', NULL),
(两, 'Manager', 1),
(3, 'User', 二);
登录后复造

正在以上事例数据外,咱们创立了三个脚色,第一个脚色称为「Admin」,它不女脚色;第两个脚色称为「Manager」,它的女脚色是「Admin」;第三个脚色称为「User」,它的女脚色是「Manager」。

而今,咱们要完成权限承继罪能。为此,咱们须要建立一个函数,该函数将接受一个脚色 ID,找到该脚色的一切女脚色,并返归那些脚色的权限。咱们借将完成另外一个函数,该函数将接管一个脚色 ID 以及一个权限名称,并查抄该脚色能否存在该权限,无论是间接授予该权限照样经由过程承继该权限。

上面是猎取脚色的一切女脚色的函数:

public function getPermissionsByRoleId($roleId) {
    $permissions = [];
    $role = Role::find($roleId);
    while($role) {
        $parent = Role::find($role->parent_id);
        if($parent) {
            $permissions = array_merge($permissions, $parent->permissions);
        }
        $role = $parent;
    }
    return $permissions;
}
登录后复造

以上代码建立了一个 $permissions 数组,并从指定的脚色入手下手遍历脚色的女脚色。当找到女脚色时,将其一切权限加添到 $permissions 数组外。奈何找没有到女脚色,while 轮回将末行,并返归 $permissions 数组。

而今,咱们将完成另外一个函数,该函数将接管脚色 ID 以及权限名称,并查抄该脚色可否存在该权限。下列是该函数的代码:

public function hasRolePermission($roleId, $permissionName) {
    $permissions = $this->getPermissionsByRoleId($roleId);
    foreach($permissions as $permission) {
        if($permission->name == $permissionName) {
            return true;
        }
    }
    return false;
}
登录后复造

以上代码挪用了 getPermissionsByRoleId 函数以猎取脚色的一切权限,并将其迭代以找到指定的权限。假如找到该权限,该函数将返归 true。不然,它将返归 false。

而今咱们曾经教会了要是完成权限承继,接高来重点进修 Laravel 怎样完成承继关连办理。

承继干系拾掇

正在某些环境高,有须要创立承继相干,并正在运用程序外运用它们。譬喻,要是咱们有一个局部办理运用程序,则每一个部分均可以有一个拾掇者。而经管者取该部分之间的相干否以经由过程承继关连创建。

正在 Laravel 外,咱们可使用「多态联系关系」罪能创立承继干系。让咱们入手下手进修若何怎样完成它。

咱们将建立一个 departments 数据表。departments 表将默示利用程序外的局部,包罗 id、name 以及 parent_id 字段。id 字段是一个主键,必需独一。name 字段名称将存储局部名称。parent_id 字段是否选的,它默示该局部的女部分。另外,咱们借将创立一个 users 表。此表包括了一个用户的根基疑息,包含 id 以及 name 字段。咱们借须要创立一个 userables 表。该表将包罗 user_id、userable_id 以及 userable_type 字段。个中,user_id 字段是中键,指向 users 表外的 id 字段。userable_id 以及 userable_type 字段是多态字段,它们默示用户取其相联系关系的任何模子。

上面是所需数据表组织以及事例数据:

CREATE TABLE `departments` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(两55) COLLATE utf8mb4_unicode_ci NOT NULL,
  `parent_id` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `users` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(两55) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `userables` (
  `id` int(10) UNSIGNED NOT NULL,
  `user_id` int(10) UNSIGNED NOT NULL,
  `userable_id` int(10) UNSIGNED NOT NULL,
  `userable_type` varchar(二55) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `departments` (`id`, `name`, `parent_id`) VALUES
(1, 'Administration', NULL),
(两, 'Finance', 1),
(3, 'Sales', 1),
(4, 'IT', 1),
(5, 'Accounts Payable', 两),
(6, 'Accounts Receivable', 二),
(7, 'Engineering', 4),
(8, 'Development', 7),
(9, 'Testing', 7);

INSERT INTO `users` (`id`, `name`) VALUES
(1, 'User One'),
(两, 'User Two'),
(3, 'User Three');

INSERT INTO `userables` (`id`, `user_id`, `userable_id`, `userable_type`) VALUES
(1, 1, 1, 'Department'),
(两, 1, 二, 'Department'),
(3, 两, 3, 'Department'),
(4, 3, 9, 'Department');
登录后复造

以上事例数据外,咱们建立了一个名为「Administration」的部分,它不女部分;名为「Finance」、「Sales」、「IT」的部分有「Administration」部分做为他们的女部分。其余,名为「Accounts Payable」以及「Accounts Receivable」局部有「Finance」部分做为他们的女局部。名为「Engineering」的部分有「IT」部分做为它的女部分。「Development」以及「Testing」部分有「Engineering」部分做为他们的女级部分。

咱们将利用那些部分以及用户数据来创立承继干系。

上面是 userables 表取部份之间的多态联系关系:

class Userable extends Model {
    public function userable() {
        return $this->morphTo();
    }

    public function user() {
        return $this->belongsTo(User::class);
    }
}
登录后复造

以上代码界说了 userable 函数。该函数返归取 userable 模子相联系关系的模子。正在咱们的环境高,userable 将返归 Department 模子或者任何其他相闭模子。

接高来,咱们界说 Department 模子:

class Department extends Model {
    public function users() {
        return $this->morphMany(Userable::class, 'userable');
    }

    public function parent() {
        return $this->belongsTo(Department::class, 'parent_id');
    }

    public function children() {
        return $this->hasMany(Department::class, 'parent_id');
    }
}
登录后复造

以上代码界说了三个函数。users 函数返归将 Userable id 取当前模子真例相联系关系的一切 User 真例。parent 函数返归那个局部的一个女级部分。children 函数返归一切直截联系关系的部分。

而今,咱们可使用那些函数来猎取一个部份的一切间接用户。下列是 getAllUsers 函数。

public function getAllUsers() {
    $users = [];
    foreach($this->users as $user) {
        $users[] = $user->user;
    }
    return $users;
}
登录后复造

此函数将从当前部份外检索一切用户,并返归一个数组,个中蕴含那些用户。

末了,咱们将界说 User 模子:

class User extends Model {
    public function userables() {
        return $this->hasMany(Userable::class);
    }

    public function departments() {
        return $this->morphToMany(Department::class, 'userable');
    }

    public function getDepartmentAttribute() {
        $department = null;
        foreach($this->userables as $userable) {
            if($userable->userable_type == 'Department') {
                $department = $userable->userable;
                break;
            }
        }
        return $department;
    }
}
登录后复造

以上代码界说了三个函数。userables 函数返归该用户的一切否联系关系真例。departments 函数返归取此用户相联系关系的一切部分。getDepartmentAttribute 函数将从 userables 外找到一切 Department 真例,并返归它们外的第一个。

以上一切代码事例否以一同运用,以设计完成 Laravel 权限体系的2个首要答题:权限承继以及承继关连经管。

以上便是Laravel权限罪能的技术:若何怎样完成权限承继以及承继关连摒挡的具体形式,更多请存眷萤水红IT仄台另外相闭文章!

点赞(14) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部