环境配置:
系统:linux
语言:php
框架:Laravel 5.8
主要技术:Zizaco/Entrust扩展包,MySQL,PHP,Composer
Zizaco/Entrust
// 1. 在项目根目录运行
composer require zizaco/entrust
// 2. 在config/App.php文件 [providers]数组中添加一项:
ZizacoEntrustEntrustServiceProvider::class,
// 3. 在config/app.php文件 [aliases]数组中添加一项:
'Entrust' => ZizacoEntrustEntrustFacade::class,
// 4. 生成迁移文件(这一步之前必须配置好数据库连接)
php artisan entrust:migration
// 5. 运行迁移文件
php artisan migrate
// 可能报错如下:
IlluminateDatabaseQueryException : 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 ZizacoEntrustTraitsEntrustUserTrait;
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
Table roles 数据
// 创建权限
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
Table permissions 数据
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,
]);
}
Table permission_role 数据
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();
}
Table users 数据
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 'AppRole' not found
这是命名空间的问题,两种解决办法:
1.把Role.php、Permission.php和用户表模型User.php 命名空间改为 App
2.根据路径 /vendor/zizaco/entrust/src/config.php
将return的数组键为'role'的值改为项目中Role.php实际命名空间
键'user'、'permission'同理 ,便可解决
Table role_user 数据
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');
}
至此,测试所需数据全部创建完毕
<!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权限设置就完成了
以上都为测试学习代码,实际生产环境中还需要根据业务需求对代码进行修改整合,但是基础的权限设计功能已经实现。
谢谢!
最后的话:
如果各位大佬有什么更好的方法,请评论或私信我,我会及时回复的,欢迎各位大佬一起来探讨技术。
如果各位感觉我的文章对您有帮助的话,请您不要吝啬您的点赞!
祝大家技术一节更比一节高!