環境配置:
系統: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');
}
至此,測試所需數據全部創建完畢
權限的使用
- 根據上面設置的角色組的權限建立測試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 擁有所有權限,登陸之后,應當顯示【菜單】以及【按鈕】,如下圖:
用戶 admin 登陸頁面顯示情況
- 用戶 test 只擁有 【菜單可見】權限,應當只顯示菜單,如下圖:
用戶 test 登陸頁面顯示情況
- 后端對于角色的判斷,不同角色執行不同代碼
public function judgeRoles()
{
// 擁有 admin 角色的用戶執行
if (session('user_info')->hasRole('admin')) {
// 業務代碼
return 'admin角色業務代碼執行完畢';
}
// 擁有 ordinary 角色的用戶執行
if (session('user_info')->hasRole('ordinary')) {
// 業務代碼
return 'ordinary角色業務代碼執行完畢';
}
至此;關于PHP權限設置就完成了
以上都為測試學習代碼,實際生產環境中還需要根據業務需求對代碼進行修改整合,但是基礎的權限設計功能已經實現。
謝謝!
最后的話:
如果各位大佬有什么更好的方法,請評論或私信我,我會及時回復的,歡迎各位大佬一起來探討技術。
如果各位感覺我的文章對您有幫助的話,請您不要吝嗇您的點贊!
祝大家技術一節更比一節高!