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

news2025/1/17 13:48:43

目录

一、安装laravel-permissions扩展

二、生成数据库迁移文件

三、执行数据迁移

四、php artisan migrate 生成的表

五、生成配置信息

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

七、测试角色、权限


一、安装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文件

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

use HasRoles;

七、测试角色、权限

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

 控制器的内容如下:

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;
use phpDocumentor\Reflection\Types\Self_;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Traits\HasRoles;

class IndexController extends Controller
{
    public function index()
    {
        //@TODO 自己测试的时候,根据步骤从上到下执行每个方法即可
        
        //添加用户、添加角色、添加权限
        //self::addUserRolePermission();

        //给用户添加角色
        //self::userAddRole();

        //给角色添加权限
        //self::roleAddPermission();

        //给用户添加权限
        self::userAddPermission();

    }

    //测试:添加测试用户、添加测试角色、添加测试权限
    private static function addUserRolePermission()
    {
        $userData = [
            ['name' => '张三', '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()
    {
        /**
         * 第一种方式:给角色添加权限 @TODO 每次添加一个权限
         * 执行完此步骤,表[role_has_permission]会多一条数据,permission_id:权限id role_id:角色id
         * 给作家添加[新增文章权限]
         */
        $role = Role::find( 1 );
        //$res = $role->givePermissionTo('新增文章');
        //print_r($res);die;

        /**
         * 第二种方式:将权限分给角色 @TODO 每次给角色添加一个权限
         * 给作家添加[查看文章]
         */
        $permission = Permission::find( 2 );
        //$res = $permission->assignRole($role);
        //print_r($res);die;

        /**
         * 第三种方式:将多个权限同步到一个角色
         * 给作家添加[查看文章 和 删除文章 权限]
         * @TODO syncPermissions 该方法会覆盖掉角色之前所有的权限
         */
        $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 );
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提升舆情监测软件技术方法解读,舆情监测技术逻辑?

舆情监测是指通过技术手段&#xff0c;对网络舆情进行监测、分析、挖掘和可视化展示的工作。舆情监测可以帮助企业、政府、组织等了解社会舆论&#xff0c;掌握社会动态&#xff0c;协助决策&#xff0c;提升社会影响力。TOOM舆情监测系统介绍提升舆情监测软件技术方法解读&…

Zabbix与乐维监控对比分析(七)——网络功能篇

前面我们详细介绍了Zabbix与乐维监控在架构与性能、Agent管理、自动发现、权限管理、对象管理、告警管理、可视化及图形图表方面的对比分析&#xff0c;接下来我们将对二者网络功能方面进行对比分析。 本篇是Zabbix与乐维监控对比专题系列文章的第七篇——网络功能篇&#xff…

gitlab+jenkins+docker持续集成环境搭建实战

介绍 什么是持续集成&#xff1f; 持续集成&#xff08;CI&#xff09;是在源代码变更后自动检测、拉取、构建和&#xff08;在大多数情况下&#xff09;进行单元测试的过程。持续集成是启动管道的环节&#xff08;尽管某些预验证 —— 通常称为 上线前检查(pre-flight checks)…

2023 数据结构复习

函数编程题 7-1 交换二叉树中每个结点的左孩子和右孩子 #include<stdio.h> #include<stdlib.h> typedef struct Node {char data;struct Node *left, *right; } Node, *Tree;Tree create() {char ch;Tree tree NULL;if (scanf("%c", &ch)) {//当有…

P5015 [NOIP2018 普及组] 标题统计————C++

题目 [NOIP2018 普及组] 标题统计 题目描述 凯凯刚写了一篇美妙的作文&#xff0c;请问这篇作文的标题中有多少个字符&#xff1f; 注意&#xff1a;标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字 符数时&#xff0c;空格和换行符不计算在内。 输入…

JAVA开发与架构(携程架构实践)

发这篇博文主要是想学习一下携程的架构。携程出了一本《携程架构实践》&#xff0c;无奈现在还没开源。看京东价大概109元人民币。如果看到次博文的网友能发我一本《携程架构实践》pdf。不胜感谢。或者实体书籍也行。其实我不怎么需要实体书籍&#xff0c;因为技术的东西很快会…

特种变色树脂T-46 CC

Tulsimer T-46 CC ISO-9001/ISO-14001/OHSAS-18000 特级强酸性阳离子交换树脂--(自变色树脂) Tulsimer T-46 CC 是一款专门研制的、优质的、强酸型的聚苯乙烯架构的阳离子交 换树脂&#xff0c;具有核子级磺酸官能团&#xff0c; 并同时拥有绝佳的物理及化学稳定品质&#x…

three.js 之 入门篇1

目录three.js 之 入门篇1&#xff1a;使用parcel搭建 three.js 开发环境2&#xff1a;运行一个简单的场景和物体2.1 main.js2.2效果3&#xff1a;轨道控制器和控制物体 mesh3.1 main.js3.2效果4&#xff1a;添加坐标辅助器 AxesHelper4.14.2效果5&#xff1a;设置几何体移动5.1…

深度学习 Day24——使用Pytorch环境实现mnist手写数字识别

深度学习 Day24——使用Pytorch环境实现mnist手写数字识别 文章目录深度学习 Day24——使用Pytorch环境实现mnist手写数字识别一、前言二、我的环境三、Pytorch简介四、前期工作1、导入依赖项和设置GPU2、导入数据3、加载数据4、数据可视化五、构建简单的CNN网络六、训练模型1、…

Spring的嵌套事务(Propagation.NESTED)到底是个啥

什么是嵌套事务 嵌套事务其实是对数据库SavePoint概念的Java操作版封装&#xff0c;什么是SavePoint参考我另一篇blog&#xff1a;juejin.cn/post/718544… SavePoint是数据库事务中的一个概念, 可以将整个事务切割为不同的小事务, 可以选择将状态回滚到某个小事务发生时的样…

Java图形化界面---AWT布局管理器

目录 一、布局管理器介绍 二、布局管理器用法 &#xff08;1&#xff09;FlowLayout &#xff08;2&#xff09;BorderLayout &#xff08;3&#xff09;GridLayout &#xff08;4&#xff09;CardLayout &#xff08;5&#xff09;BoxLayout 三、Box容器的讲解 一、布…

自主实现HTTP

"让我们&#xff0c;跳吧在无比宏达的星系!" 一、背景 超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么…

STL list容器底层代码剖析、正向迭代器与反向迭代器的类的封装

目录 一、迭代器是什么 二、迭代器的本质 三、如何给一个容器实现迭代器功能 四、正向迭代器功能的具体实现 五、反向迭代器 六、list底层代码剖析 一、迭代器是什么 迭代器&#xff08;iterator&#xff09;有时又称光标&#xff08;cursor&#xff09;是程序设计的软件设…

【手写 Vue2.x 源码】第六篇 - 数据代理的实现

一&#xff0c;前言 上篇&#xff0c;主要介绍了 Vue 数据初始化流程中&#xff0c;数组类型的数据劫持是如何实现的&#xff0c;核心思路如下&#xff1a; 出于对性能的考虑&#xff0c;Vue 没有对数组采用 Object.defineProperty 进行递归劫持&#xff0c;而是对能够导致原…

NOSQL数据库习题

NOSQL数据库习题第一章第二章第三章第四章第五章NoSQL数据库上机测试第一章 1.写出DB、RDB、DBMS、TRDB、NoSQL、NewSQL、NDFS的中文名称。 答&#xff1a;DB&#xff1a;数据库 RDB&#xff1a;关系型数据库 DBMS&#xff1a;数据库管理系统 TRDB&#xff1a;传统关系型数据…

解决Shotgrid登陆不上, 上传出错,窗口卡住不动等问题

在使用Shotgrid时&#xff0c;是否遇到这种问题&#xff1a; accounts.autodesk.com出错 auth.autodesk.com出错 再或者这样出错&#xff1a; Shotgrid登陆出错 再再这样关闭Load…时这样出错&#xff0c; 窗口半天都关闭不了&#xff1a; 分析&#xff1a; 1 出现这种错…

(一分钟)激光SLAM扫描匹配 文献阅读

本博客介绍了激光SLAM扫描匹配的相关问题。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;扫描匹配也是数据关联类的问题&#xff0c;是SLAM里面的重要构成部分。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&…

PyTorch实例2——文本情绪分类器

实例主要用于熟悉相关模型&#xff0c;并且练习创建一个模型的步骤&#xff1a;数据收集、数据预处理、构建模型、训练模型、测试模型、观察模型表现、保存模型传送门&#xff1a;蓝桥云课实验 目录1. 实验环境2. 实验目的3. 相关原理4. 实验步骤4.1 数据收集从在线商城抓取评论…

OpenHarmony 标准系统HDF框架之I2C驱动开发

OpenHarmony 标准系统HDF框架之I2C驱动开发主要内容I2C 基础知识## I2C 基础知识 —— 概念和特性I2C 基础知识 —— 协议、四种信号组合I2C 调试手段## I2C 调试手段 —— 硬件I2C 调试手段 —— 软件HDF 框架下的 I2C 设备驱动## HDF 框架下的 I2C 设备驱动 —— 案例描述HDF…

Shell 传递参数

我们可以在执行 Shell 脚本时&#xff0c;向脚本传递参数&#xff0c;脚本内获取参数的格式为&#xff1a;$n。n 代表一个数字&#xff0c;1 为执行脚本的第一个参数&#xff0c;2 为执行脚本的第二个参数&#xff0c;以此类推……实例以下实例我们向脚本传递三个参数&#xff…