您的位置:首页 > 技术中心 > php框架 >

laravel-permission 角色权限控制【代码详解】

时间:2020-06-20 13:35

下面由Laravel教程栏目给大家介绍laravel-permission 角色权限控制,希望对需要的朋友有所帮助!

首先还是贴出GitHub的地址

https://github.com/spatie/laravel-permission

然后说一下使用心得

先说数据库的表结构把一共有6张表,也可以根据可以喜好添加,修改删除表,不过我们还是先列出表!

首先是用户表(users)不用说了都是一些基本信息包括名字,邮箱什么的!

权限表(permissions)权限表就是存放所有权限的一张表,权限可以是控制器访问权限,接口访问权限,model访问权限,在这里我们只讨论接口访问权限!

角色表(roles)角色表就是存放你所有的角色,角色的名字为索引!

基本的表有了,那他们是怎么关联的呢?请继续往下看!

用户拥有权限表(model_has_permissions)這张表记录的就是user_id,permission_id的多对多的关系表,用户直接获取权限。

用户拥有角色表(model_has_roles)这张表记录的用户拥有的权限,表里有user_id,role_id这个也是记录用户和角色多对多的关系表,也可以理解为中间表!

角色拥有权限表(role_has_permissions)這张表记录的是角色拥有哪些权限,表里就2个字段role_id,permission_id!也可以根据需要进行拓展!

下面给出一张图,来直观的看下各个关联关系:


用户直接拥有权限,model_has_permissions,用户拥有角色那么就是model_has_role然后到roles表中role_has_permission

如何添加角色(依赖包提供了方法)

$role = Role::Create(['name' => 'add_title']);

Create有几个参数呢?原方法中有一个name和guard_name,如下面代码

use Spatie\Permission\Models\Role;
public static function create(array $attributes = [])
{
    $attributes['guard_name'] = $attributes['guard_name'] ?? config('auth.defaults.guard');

    if (static::where('name', $attributes['name'])->where('guard_name', $attributes['guard_name'])->first()) {
        throw RoleAlreadyExists::create($attributes['name'], $attributes['guard_name']);
    }

    if (isNotLumen() && app()::VERSION < '5.4') {
        return parent::create($attributes);
    }

    return static::query()->create($attributes);
}

我们也可以不用这个方法,去调用它原有的task也可以,比如项目初始化自带的seeder中就调用task

namespace App\Containers\Authorization\Data\Seeders;
Apiato::call('Authorization@CreateRoleTask', ['admin', 'Administrator', 'Administrator Role', 999,'admin']);

跟着命名空间地址去找就能找到seeder、这个task也在Authorization下面Task里面、可以自己修改Task来符合自己的需求!

如何添加权限(依赖包也提供了方法)

$ permission  =  Permission :: create([ ' name '  =>  ' edit articles ' ]);

跟role一样也可以找到一个写好的Task以及它的create方法!在这里就不过多说了!

如何直接给用户添加权限,删除权限,判断是否有权限

//可以授予任何用户权限:
$ user - > givePermissionTo(' edit articles ');

//你也可以一次给多个权限
$ user - > givePermissionTo( ' edit articles ', ' delete articles ');

//你也可以传递数组
$ user - > givePermissionTo([ ' edit articles ', ' delete articles ' ]);
//权限可以从用户撤销:
$ user - > revokePermissionTo(' edit articles ');
//或者一次性撤消并添加新的权限:
$ user - > syncPermissions([ ' edit articles ',' delete articles ' ]);
//您可以测试用户是否有权限:
$ user - > hasPermissionTo(' edit articles ');
//测试用户有多个权限:
$ user - > hasAnyPermission([ ' edit articles ',' publish articles ',' unpublish articles ' ]);
//您可以使用Laravel的默认can功能测试用户是否具有权限:
$ user - > can(' edit articles ');

如何通过角色使用权限

//角色可以分配给任何用户:
$ user - > assignRole(' writer ');

//你也可以一次赋值多个角色
$ user - > assignRole( ' writer ', ' admin ');
//或者作为一个数组
$ user - > assignRole([ ' writer ', ' admin ' ]);
//角色可以从用户中删除:
$ user - > removeRole(' writer ');
//角色也可以同步:
//所有当前角色将被从用户中删除,而由传入的数组取代
$ user - > syncRoles([ ' writer ', ' admin ' ]);
//您可以确定用户是否具有某个角色:
$ user - > hasRole(' writer ');
//您还可以确定用户是否有任何给定的角色列表:
$ user - > hasAnyRole(Role :: all());
//您还可以确定用户是否具有所有给定的角色列表:
$ user - > hasAllRoles(Role :: all());
//assignRole,hasRole,hasAnyRole,hasAllRoles 和removeRole函数可以接受一个字符串,
//一个\Spatie\Permission\Models\Role对象或一个\Illuminate\Support\Collection对象。

//可以给角色一个许可:
$ role - > givePermissionTo(' edit articles ');
//您可以确定角色是否具有某种权限:
$ role - > hasPermissionTo(' edit articles ');
//权限可以从角色中被撤销:
$ role - > revokePermissionTo(' edit articles ');
//该givePermissionTo和revokePermissionTo函数可以接受字符串或Spatie\Permission\Models\Permission对象。
//权限是从角色自动继承的。另外,个人权限也可以分配给用户。例如:
$ role  =  Role :: findByName(' writer '); 
$ role - > givePermissionTo(' edit articles ');
$ user - > assignRole(' writer ');
$ user - > givePermissionTo(' delete articles ');
//在上面的例子中,角色被授予编辑文章的权限,并且该角色被分配给用户。现在,用户可以编辑文章并删除文章。
//“删除文章”的权限是直接分配给用户的直接权限。
//当我们调用$user->hasDirectPermission('delete articles')它返回true,
//但false对$user->hasDirectPermission('edit articles')。
//如果为应用程序中的角色和用户设置权限并希望限制或更改用户角色的继承权限(即,仅允许更改用户的直接权限),则此方法非常有用。
//您可以列出所有这些权限:
//直接权限
$ user - > getDirectPermissions() //或$ user-> permissions;

//从用户角色继承的权限
$ user - > getPermissionsViaRoles();

//所有适用于用户的权限(继承和直接)
$ user - > getAllPermissions();
//所有这些响应都是Spatie\Permission\Models\Permission对象的集合。
//如果我们按照前面的例子,第一个响应将是一个具有delete article权限的集合,
//第二个响应将是一个具有权限的集合,edit article第三个将包含这两个集合。

在哪儿做限制,在哪儿使用

首先你可以在action中检测这个用户有没有这项权限!

你还可以在request中使用,当用户请求一个接口时、系统会去判断用户是否拥有通过这个接口的权限和角色!

这个request当然要在接口调用方法的时候注入进去!

下面给出位置

namespace App\Containers\Authorization\UI\API\Requests;
/**
 * Define which Roles and/or Permissions has access to this request.
 *
 * @var  array
 */
protected $access = [
    'permissions' => 'add-permission-byRole',
    'roles'       => '',
];

总结:

laravel有几个角色权限控制,但是我选择这个,laravel-permission好搜索、不是因为谁好谁差的!总的来说角色权限就角色表和权限表,然后就是用户、角色、权限的关系维护!其实也可以不用他自带的方法!

基本表的关系都是多对多可以使用attach和detch、sync来维护他们之间的关系!

如果自己玩得够熟悉了,也不需要他的关系表,完全可以自己写好来实现这一成的关系!

以上就是laravel-permission 角色权限控制【代码详解】的详细内容,更多请关注gxlsystem.com其它相关文章!

热门排行

今日推荐

热门手游