環境配置:
系統: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
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 = '[email protected]'; $userModel->password = '123456'; //未做加密處理,生產環境請做加密 $userModel->save(); $userModel = new User(); $userModel->name = 'test'; $userModel->email = '[email protected]'; $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 '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'同理 ,便可解決
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許可權設定就完成了
以上都為測試學習程式碼,實際生產環境中還需要根據業務需求對程式碼進行修改整合,但是基礎的許可權設計功能已經實現。
最後的話:
祝大家技術一節更比一節高!