首頁>技術>

環境配置:

系統: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許可權設定就完成了

以上都為測試學習程式碼,實際生產環境中還需要根據業務需求對程式碼進行修改整合,但是基礎的許可權設計功能已經實現。

最後的話:

祝大家技術一節更比一節高!

19
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • C語言零基礎教程之預處理和宏定義篇