网站首页 > 技术文章 正文
环境配置:
系统:Linux
语言:PHP
框架:Laravel 5.8
主要技术:Zizaco/Entrust扩展包,MySQL,PHP,Composer
扩展包名称:
Zizaco/Entrust
安装配置:
// 1. 在项目根目录运行
composer require zizaco/entrust
// 2. 在config/app.php文件 [providers]数组中添加一项:
Zizaco\Entrust\EntrustServiceProvider::class,
// 3. 在config/app.php文件 [aliases]数组中添加一项:
'Entrust' => Zizaco\Entrust\EntrustFacade::class,
// 4. 生成迁移文件(这一步之前必须配置好数据库连接)
php artisan entrust:migration
// 5. 运行迁移文件
php artisan migrate
// 可能报错如下:
Illuminate\Database\QueryException : SQLSTATE[42000]:
Syntax error or access violation: 1071 Specified key was too long;
max key length is 1000 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))
// 解决方式:在 app/Providers/AppServiceProvider.php文件 【boot】方法中 添加:
Schema::defaultStringLength(191);
// 6. 这时数据库中会创建4个表
1. permissions -----------权限表
2. permission_role ------ 权限角色关系表
3. roles ------------------ 角色表
4. role_user ------------- 角色用户关系表
// 7. 在用户表模型中添加:
// ...省略多余代码
use Zizaco\Entrust\Traits\EntrustUserTrait;
class User extends Authenticatable
{
use EntrustUserTrait;
use Notifiable;
// ...省略多余代码
}
// 8. 创建表模型,在项目根目录运行
php artisan make:model Model/Role
php artisan make:model Model/Permission
至此;配置部分完毕!
创建数据、模拟用户登陆
- 创建角色 (创建两个角色,后期测试会用到)
public function createRoles()
{
// 创建第一个角色
$roleModel = new Role();
$roleModel->name = 'admin'; //角色名称
$roleModel->display_name = '管理员'; //角色可读名称
$roleModel->save();
// 创建第二个角色
$roleModel = new Role();
$roleModel->name = 'ordinary'; //角色名称
$roleModel->display_name = '普通用户'; //角色可读名称
$roleModel->save();
}
//roles表->得到 admin ID 为1,ordinary ID为2
- 创建权限(可细分的权限)
// 创建权限
public function createPermissions()
{
// 创建第一个权限
$permissionModel = new Permission();
$permissionModel->name = 'btn_display'; //权限名称
$permissionModel->display_name = '按钮可见'; //权限可读名称
$permissionModel->save();
// 创建第二个权限
$permissionModel = new Permission();
$permissionModel->name = 'menu_display'; //权限名称
$permissionModel->display_name = '菜单可见'; //权限可读名称
$permissionModel->save();
}
// permissions表->得到 btn_display ID为1 menu_display ID为2
- 为角色分配权限
public function setRolesPerm()
{
// 1. 设置 admin 角色权限
// 获取角色ID
$user_id = Role::where('name', 'admin')->first(['id']);
// 获取所有权限,让admin拥有所有权限
$permissions = Permission::get(['id']);
// 向 permission_role 表中写入数据
foreach ($permissions as $per) {
DB::table('permission_role')->insert([
'permission_id' => $per->id,
'role_id' => $user_id->id,
]);
}
// 1. 设置 ordinary 角色权限
// 获取角色ID
$user_id = Role::where('name', 'ordinary')->first(['id']);
// 获取所有权限,让ordinary只拥有按钮可见权限
$permissions = Permission::where('name', 'btn_display')->first(['id']);
// 向 permission_role 表中写入数据
DB::table('permission_role')->insert([
'permission_id' => $per->id,
'role_id' => $user_id->id,
]);
}
- 创建用户
public function createUser()
{
$userModel = new User();
$userModel->name = 'admin';
$userModel->email = '1234567@qq.com';
$userModel->password = '123456'; //未做加密处理,生产环境请做加密
$userModel->save();
$userModel = new User();
$userModel->name = 'test';
$userModel->email = '123456789@qq.com';
$userModel->password = '123456'; //未做加密处理,生产环境请做加密
$userModel->save();
}
- 为用户分配角色组
public function setUserRole()
{
// 1. 赋予 admin 用户 admin 角色
$user_info = User::where('name', 'admin')->first();
$role_info = Role::where('name', 'admin')->first();
$user_info->attachRole($role_info);
// 1. 赋予 test 用户 ordinary 角色
$user_info = User::where('name', 'test')->first();
$role_info = Role::where('name', 'ordinary')->first();
$user_info->attachRole($role_info);
}
如遇报错:Class 'App\Role' not found
这是命名空间的问题,两种解决办法:
1.把Role.php、Permission.php和用户表模型User.php 命名空间改为 App\
2.根据路径 /vendor/zizaco/entrust/src/config.php
将return的数组键为'role'的值改为项目中Role.php实际命名空间
键'user'、'permission'同理 ,便可解决
- 登陆
public function Login()
{
// 此处应接受前端数据进行验证
// 这边不再赘述 直接模拟登陆
// 用户 admin 登陆
$user_info = User::where('name', 'admin')->first();
// 用户 test 登陆
// $user_info = User::where('name', 'test')->first();
// 将用户信息存入Session
session(['user_info' => $user_info]);
return view('index');
}
至此,测试所需数据全部创建完毕
权限的使用
- 根据上面设置的角色组的权限建立测试HTML(index.blade.php)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>权限测试</title>
</head>
@if(session('user_info')->can('menu_display'))
<h1>菜单</h1>
@endif
@if(session('user_info')->can('btn_display'))
<button>按钮</button>
@endif
<body>
</body>
</html>
- 用户 admin 拥有所有权限,登陆之后,应当显示【菜单】以及【按钮】,如下图:
- 用户 test 只拥有 【菜单可见】权限,应当只显示菜单,如下图:
- 后端对于角色的判断,不同角色执行不同代码
public function judgeRoles()
{
// 拥有 admin 角色的用户执行
if (session('user_info')->hasRole('admin')) {
// 业务代码
return 'admin角色业务代码执行完毕';
}
// 拥有 ordinary 角色的用户执行
if (session('user_info')->hasRole('ordinary')) {
// 业务代码
return 'ordinary角色业务代码执行完毕';
}
至此;关于PHP权限设置就完成了
以上都为测试学习代码,实际生产环境中还需要根据业务需求对代码进行修改整合,但是基础的权限设计功能已经实现。
谢谢!
最后的话:
如果各位大佬有什么更好的方法,请评论或私信我,我会及时回复的,欢迎各位大佬一起来探讨技术。
如果各位感觉我的文章对您有帮助的话,请您不要吝啬您的点赞!
祝大家技术一节更比一节高!
猜你喜欢
- 2024-09-15 laravel 使用 mongodb(laravel 使用gmail邮箱发送验证码)
- 2024-09-15 Laravel的这10个用法,你都没用过吧
- 2024-09-15 3分钟短文:太爽了,用Laravel写API接口
- 2024-09-15 Laravel5.8简明教程(laravel-admin)
- 2024-09-15 3分钟短文:Laravel请求对象方法极多,可不是花拳绣腿
- 2024-09-15 「php」从零学laravel框架(二):注册登录API
- 2024-09-15 Laravel 5中如何添加Form功能(laravel 伪静态)
- 2024-09-15 告别 $arr[0]: PHP 和 Laravel 中更优雅的数组处理方式
- 2024-09-15 Laravel + Serverless Framework 快速创建 CMS 内容管理系统
- 2024-09-15 3分钟短文:Laravel模型创建数据条目的2个语法糖
- 1512℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 556℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 504℃MySQL service启动脚本浅析(r12笔记第59天)
- 482℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 481℃启用MySQL查询缓存(mysql8.0查询缓存)
- 461℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 441℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 438℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)