0

0

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

藏色散人

藏色散人

发布时间:2020-06-20 13:33:17

|

9651人浏览过

|

来源于csdn

转载

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

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,如下面代码

无限画
无限画

千库网旗下AI绘画创作平台

下载
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来维护他们之间的关系!

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

46

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

178

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

51

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

532

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

171

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号