我的编程空间,编程开发者的网络收藏夹
学习永远不晚

laravel5.5.50之权限(laravel-permissions)的使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

laravel5.5.50之权限(laravel-permissions)的使用

目录

一、安装laravel-permissions扩展

二、生成数据库迁移文件

三、执行数据迁移

四、php artisan migrate 生成的表

五、生成配置信息

六、permission.php 文件的使用和说明

七、在user模型下加载角色相关信息

八、测试角色、权限

九、有关用户、角色、权限方法的使用

十、权限中间件的使用

十一、使用 artisan 命令操作权限

十二、权限缓存的使用


一、安装laravel-permissions扩展

#不指定安装版本的命令composer require spatie/laravel-permission#指定安装版本的命令composer require "spatie/laravel-permission:~2.7"

 说明:~2.7是安装的版本,因为需要根据框架的版本选择permission扩展的版本(根据个人框架版本来选择。我安装的是2.7版本)

二、生成数据库迁移文件

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

 执行完生成迁移文件命令,就会在 \database\migrations 目录下,生成一个以_create_permission_tables.php 结尾的文件。

三、执行数据迁移

php artisan migrate

 如果MySQL版本低,执行完命令就会报错,错误如下

意思就是:MySQL版本低,列的字段长度太长。
解决方法:修改app里的providers里的AppServiceProvider.php文件

\Schema::defaultStringLength(191);

 再次执行:php artisan migrate 命令即可

四、php artisan migrate 生成的表

  1. 首先是用户表(users)都是一些基本用户信息包括名字、邮箱、密码什么的。
  2. 权限表(permissions)权限表就是存放所有权限的一张表,权限可以是控制器访问权限,接口访问权限,model访问权限。
  3. 角色表(roles)角色表就是存放你所有的角色。
  4. 用户权限表(model_has_permissions)这张表记录的就是model_id,permission_id的多对多的关系表,用户直接获取权限。
  5. 用户角色表(model_has_roles)这张表记录的用户拥有的角色,表里有model_id,role_id这个也是记录用户和角色多对多的关系表。
  6. 角色权限表(role_has_permissions)这张表记录的是角色拥有哪些权限,表里就2个字段role_id,permission_id,也可以根据需要进行拓展!

五、生成配置信息

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

 会在 config 目录下生成一个:permission.php文件

六、permission.php 文件的使用和说明

return [            'models' => [                                'permission' => Spatie\Permission\Models\Permission::class,                                'role'       => Spatie\Permission\Models\Role::class,],            'table_names' => [                                'roles'       => 'roles',                                'permissions' => 'permissions',                                'model_has_permissions' => 'model_has_permissions',                                'model_has_roles'       => 'model_has_roles',                                'role_has_permissions'  => 'role_has_permissions',            ],            'column_names' => [                                'model_morph_key' => 'model_id',            ],                        'display_permission_in_exception' => false,            'cache' => [                                'expiration_time' => \DateInterval::createFromDateString('24 hours'),                                'key' => 'spatie.permission.cache',                                'model_key' => 'name',                                'store' => 'default',            ],        ];

七、在user模型下加载角色相关信息

use HasRoles;

八、测试角色、权限

#新建一个控制器php artisan make:controller IndexController

 控制器的内容如下:

 '张三', 'mobile' => '13666666666', 'password' => '123',],            ['name' => '李四', 'mobile' => '13888888888', 'password' => '123',],        ];        //添加用户        $userInfo = User::insert( $userData );        //添加角色        $roleData = [            ['name' => '作家',],            ['name' => '读者'],        ];        foreach($roleData as $roleValue){            $role = Role::create( $roleValue );        }        //添加权限        $permissionData = [            ['name' => '新增文章'],            ['name' => '编辑文章'],            ['name' => '查看文章'],            ['name' => '删除文章'],        ];        foreach($permissionData as $permissionValue){            $permission = Permission::create( $permissionValue );        }        echo 'ok';        die;    }    //测试:给用户添加角色    private static function userAddRole()    {        //执行完此步骤,表[model_has_roles]会多一条数据,model_type=App\User:就代表是用户 role_id:角色id model_id:用户id        $user = User::find( 1 );        $res  = $user->assignRole( '作家' );        print_r( $res );    }    //测试:给角色添加权限    private static function roleAddPermission()    {                $role = Role::find( 1 );        //$res = $role->givePermissionTo('新增文章');        //print_r($res);die;                $permission = Permission::find( 2 );        //$res = $permission->assignRole($role);        //print_r($res);die;                $permission    = Permission::whereIn( 'id', [1, 2] )->get();        $allPermission = $role->syncPermissions( $permission );    }    //测试:给用户添加权限    private static function userAddPermission()    {        //执行完此步骤,表[model_has_permission]会多一条数据,model_type=App\User:就代表是用户        $user              = User::find( 1 );        $addUserPermission = $user->givePermissionTo( '新增文章' );        print_r( $addUserPermission );    }}

九、有关用户、角色、权限方法的使用

$cachePermission = Cache::get('spatie.permission.cache');$role = Role::find(1);$deleteRes = $role->revokePermissionTo('查看文章');print_r($deleteRes->toArray());//从角色中删除权限:方式2(通过权限删除)$permission = Permission::find(4);$deleteRes = $permission->removeRole($role);print_r($deleteRes->toArray());$user = User::find( 1 );//获取某个用户的所有权限$permissions = $user->permissions;print_r($permissions->toArray());//获取用户通过角色继承的所有权限$permissions = $user->getAllPermissions();print_r($permissions->toArray());//获取某个用户的所有角色$roles = $user->getRoleNames();print_r($roles);//仅返回具有角色 '作家' 的用户 $user = User::role( '作家' )->get();print_r($user->toArray());//仅返回具有 '新增文章'(继承或直接)权限的用户$user = User::permission( '新增文章' )->get();print_r($user->toArray());//可以撤销用户权限$user->revokePermissionTo('新增文章');//或者一次性撤消并添加新的权限$user->syncPermissions(['新增文章', '删除文章']);//测试用户是否拥有权限$user->hasPermissionTo('新增文章');//或者可以传递一个代表权限 ID 的整数$user->hasPermissionTo(1);$user->hasPermissionTo(Permission::find(1)->id);$user->hasPermissionTo($somePermission->id);//同时校验用户是否拥有多个权限(通过权限 名称 校验)$user->hasAnyPermission(['新增文章', '编辑文章', '删除文章']);//同时校验用户是否同时拥有多个权限(通过权限 ID 校验)$user->hasAnyPermission(['新增文章', 2, 4]);//校验用户是否具有某个角色$user->hasRole('作家');//还可以确定用户是否具有任何给定的角色列表$user->hasAnyRole(Role::all());//还可以确定用户是否具有所有给定的角色列表$user->hasAllRoles(Role::all());//可以给角色一个许可$role->givePermissionTo('编辑文章');//确定角色是否具有某种权限$role->hasPermissionTo('编辑文章');//角色撤销权限$role->revokePermissionTo('编辑文章');//权限是从角色自动继承的。 当让,个人权限也可以分配给用户$role = Role::findByName('作家');$role->givePermissionTo('编辑文章');$user->assignRole('作家');$user->givePermissionTo('删除文章');在上面的示例中,角色被授予编辑文章的权限,并且该角色被分配给用户。 现在,用户可以编辑文章并删除文章。 ‘删除文章’ 的权限是用户的直接许可,因为它直接分配给他们。当我们调用 $user->hasDirectPermission('删除文章') 时,它会返回 true而对 $user->hasDirectPermission('编辑文章') 返回 false。//如果你为应用程序中的角色和用户构建权限并希望限制或更改用户角色的继承权限(即仅允许更改用户的直接权限),则此方法非常有用。//直接权限$user->getDirectPermissions(); 或者使用 $user->permissions//从用户角色继承的权限$user->getPermissionsViaRoles();//适用于用户的所有权限(继承和直接)$user->getAllPermissions();所有这些响应都是 Spatie\Permission\Models\Permission 对象的集合。

十、权限中间件的使用

laravel-permission扩展附带 RoleMiddlewarePermissionMiddleware 中间件。 你可以将它们添加到你的 app/Http/Kernel.php 文件中。

'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,

然后,你可以使用中间件规则保护你的路由:

#例如Route::group(['middleware' => ['role:super-admin']], function () { // });Route::group(['middleware' => ['permission:删除文章']], function () { // });Route::group(['middleware' => ['role:super-admin','permission:删除文章']], function () { // });或者,您可以用 |(管道)字符分隔多个角色或权限Route::group(['middleware' => ['role:super-admin|作家']], function () { // });Route::group(['middleware' => ['permission:新增文章|编辑文章']], function () { // });

通过在构造函数中设置所需的中间件,可以同样保护您的控制器

public function __construct(){   $this->middleware( ['role:超级管理员', 'permission:删除文章|编辑文章'] );}

十一、使用 artisan 命令操作权限

可以使用 artisan 命令从控制台创建角色或权限

php artisan permission:create-role 作家php artisan permission:create-permission "新增文章"

在为特定守卫创建权限和角色时,可以将守卫名称指定为第二个参数

php artisan permission:create-role 作家 webphp artisan permission:create-permission "新增文章" web

十二、权限缓存的使用

当你使用提供的方法来操作角色和权限时,缓存会自动为您重置

$user->assignRole('作家'); $user->removeRole('作家'); $user->syncRoles(params); $role->givePermissionTo('编辑文章'); $role->revokePermissionTo('编辑文章'); $role->syncPermissions(params); $permission->assignRole('作家'); $permission->removeRole('作家'); $permission->syncRoles(params);

但是,如果直接在数据库中操作“权限/角色”数据而不是调用提供的方法,则除非手动重置缓存,否则不会在应用程序中看到反映的更改。

要手动重置此软件包的缓存,请运行:

php artisan cache:forget spatie.permission.cache

来源地址:https://blog.csdn.net/wplblog/article/details/128574376

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

laravel5.5.50之权限(laravel-permissions)的使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android权限管理之Permission权限机制及使用详解

前言:最近突然喜欢上一句诗:“宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒。” 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过程中讨论比较多的一个知识点Android 6.0 权限适配问题
2022-06-06

Laravel中permission权限管理的扩展包怎么用

这篇“Laravel中permission权限管理的扩展包怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Laravel
2023-06-30

Linux的UMASK权限怎么使用

本篇内容主要讲解“Linux的UMASK权限怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux的UMASK权限怎么使用”吧!在linux系统中,我们创建一个新的文件或者目录的时候,
2023-06-27

Linux/ubuntu系统权限chmod的使用

chmod命令用于修改文件或目录的权限。权限分为三个部分:文件所有者、文件所属组和其他用户。基本的命令格式如下:```chmod [选项] 模式 文件或目录```其中,模式可以有以下几种形式:- 数字形式:使用三个数字表示权限,每个数字代表
2023-09-21

Spring Security中的权限注解如何使用

今天小编给大家分享一下Spring Security中的权限注解如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Spr
2023-06-30

怎么使用ThinkPHP实现用户权限的功能

这篇“怎么使用ThinkPHP实现用户权限的功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用ThinkPHP实现用
2023-07-05

Android用代码获取手机root之后的最高权限

用代码获取最高权限首先手机得root,没有root请不要往下看。 首先是写一个静态方法 代码如下: public static boolean isRoot(String pkgCodePath) { Process process =
2022-06-06

ABAP的权限检查跟踪工具怎么使用

这篇文章主要介绍“ABAP的权限检查跟踪工具怎么使用”,在日常操作中,相信很多人在ABAP的权限检查跟踪工具怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ABAP的权限检查跟踪工具怎么使用”的疑惑有所
2023-06-04

怎么在Fedora中为用户授予使用Docker的权限

小编给大家分享一下怎么在Fedora中为用户授予使用Docker的权限,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为用户授予使用Docker的权限Fedora
2023-06-16

ubuntu使用root用户登录/切换root权限的实现

ubuntu系统默认root用户是不能登录的,密码也是空的。 如果要使用root用户登录,必须先为root用户设置密码 打开终端,输入:sudo passwd root 然后按回车 此时会提示你输入密码,在password:后输入你现在登录
2022-06-04

Spring Security单点登录的权限功能怎么使用

这篇文章主要介绍“Spring Security单点登录的权限功能怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Security单点登录的权限功能怎么使用”文章能帮助大家解决问
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录