日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

laravel5.5.50之权限(laravel-permissions)的使用

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 laravel5.5.50之权限(laravel-permissions)的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、安裝laravel-permissions擴展

二、生成數據庫遷移文件

三、執行數據遷移

四、php artisan migrate 生成的表

五、生成配置信息

六、permission.php 文件的使用和說明

七、在user模型下加載角色相關信息

八、測試角色、權限

九、有關用戶、角色、權限方法的使用

十、權限中間件的使用

十一、使用 artisan 命令操作權限

十二、權限緩存的使用


一、安裝laravel-permissions擴展

#不指定安裝版本的命令 composer require spatie/laravel-permission#指定安裝版本的命令 composer require "spatie/laravel-permission:~2.7"

?說明:~2.7是安裝的版本,因為需要根據框架的版本選擇permission擴展的版本(根據個人框架版本來選擇。我安裝的是2.7版本)

二、生成數據庫遷移文件

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

?執行完生成遷移文件命令,就會在 \database\migrations 目錄下,生成一個以_create_permission_tables.php 結尾的文件。

三、執行數據遷移

php artisan migrate

?如果MySQL版本低,執行完命令就會報錯,錯誤如下

意思就是:MySQL版本低,列的字段長度太長。
解決方法:修改app里的providers里的AppServiceProvider.php文件

\Schema::defaultStringLength(191);

?再次執行:php artisan migrate 命令即可

四、php artisan migrate 生成的表

  • 首先是用戶表(users)都是一些基本用戶信息包括名字、郵箱、密碼什么的。
  • 權限表(permissions)權限表就是存放所有權限的一張表,權限可以是控制器訪問權限,接口訪問權限,model訪問權限。
  • 角色表(roles)角色表就是存放你所有的角色。
  • 用戶權限表(model_has_permissions)這張表記錄的就是model_id,permission_id的多對多的關系表,用戶直接獲取權限。
  • 用戶角色表(model_has_roles)這張表記錄的用戶擁有的角色,表里有model_id,role_id這個也是記錄用戶和角色多對多的關系表。
  • 角色權限表(role_has_permissions)這張表記錄的是角色擁有哪些權限,表里就2個字段role_id,permission_id,也可以根據需要進行拓展!
  • 五、生成配置信息

    php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

    ?會在 config 目錄下生成一個:permission.php文件

    六、permission.php 文件的使用和說明

    return ['models' => [/*** @TODO 當使用這個包中的“HasPermissions”特性時,我們需要知道應該使用哪個Eloquent模型來檢索您的權限。* 當然,它通常只是“許可”模式,但你可以使用任何你喜歡的。* 要用作權限模型的模型需要實現“Spatie\Permission\Contracts\Permission”契約。*/'permission' => Spatie\Permission\Models\Permission::class,/*** @TODO 當使用這個包中的“HasRoles”特性時,我們需要知道應該使用哪個Eloquent模型來檢索角色。* 當然,它通常只是“角色”模型,但你可以使用任何你喜歡的。* 要用作角色模型的模型需要實現“Spatie\Permission\Contracts\Role”契約。*/'role' => Spatie\Permission\Models\Role::class,],'table_names' => [/*** @TODO 當使用這個包中的“HasRoles”特性時,我們需要知道是哪個表應該用于檢索角色。* 我們選擇了一種基本的默認值,但您可以很容易地將其更改為任何您喜歡的表。*/'roles' => 'roles',/*** @TODO 當使用這個包中的“HasPermissions”特性時,我們需要知道是哪個表應用于檢索您的權限。* 我們選擇了一種基本的默認值,但您可以很容易地將其更改為任何您喜歡的表。*/'permissions' => 'permissions',/*** @TODO 當使用這個包中的“HasPermissions”特性時,我們需要知道是哪個表應該用于檢索您的模型權限。* 我們選擇了基本的默認值,但您可以輕松地將其更改為任何您喜歡的表。*/'model_has_permissions' => 'model_has_permissions',/*** @TODO 當使用這個包中的“HasRoles”特性時,我們需要知道是哪個表應該用于檢索模型角色。* 我們選擇了基本的默認值,但您可以輕松地將其更改為任何您喜歡的表。*/'model_has_roles' => 'model_has_roles',/*** @TODO 當使用這個包中的“HasRoles”特性時,我們需要知道是哪個表應該用于檢索角色權限。* 我們選擇了基本的默認值,但您可以輕松地將其更改為任何您喜歡的表。*/'role_has_permissions' => 'role_has_permissions',],'column_names' => [/** @ TODO 如果您希望將相關的模型主鍵命名為`model_id`.* 例如,如果您的主鍵都是uuid,這就很好了。在這種情況下,將其命名為`model_uuid`.*/'model_morph_key' => 'model_id',],/*** @TODO 當設置為true時,所需的權限/角色名稱將添加到異常中消息。* 在某些情況下,這可以被認為是信息泄露,所以為了最佳的安全性,這里的默認設置為false。*/'display_permission_in_exception' => false,'cache' => [/*** @TODO 默認情況下,所有權限都會緩存24小時,以提高性能。當權限或角色更新時,緩存會自動刷新。*/'expiration_time' => \DateInterval::createFromDateString('24 hours'),/*** @TODO 用于存儲所有權限的緩存鍵。*/'key' => 'spatie.permission.cache',/*** @TODO 當通過傳遞permission來檢查模型的權限時實例,則此鍵確定Permissions模型上的哪個屬性用于緩存。* 理想情況下,這應該匹配您首選的檢查權限的方式,例如:`$user->can('view-posts')` 應該是 'name'.*/'model_key' => 'name',/*** @TODO 您可以選擇使用cache.php配置文件中列出的任何“store”驅動程序來指定特定的緩存驅動程序用于權限和角色緩存。* 這里使用'default'意味著使用cache.php中的'default'設置。*/'store' => 'default',],];

    七、在user模型下加載角色相關信息

    use HasRoles;

    八、測試角色、權限

    #新建一個控制器 php artisan make:controller IndexController

    ?控制器的內容如下:

    <?phpnamespace App\Http\Controllers;use App\User; use Illuminate\Http\Request; use phpDocumentor\Reflection\Types\Self_; use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Role; use Spatie\Permission\Traits\HasRoles;class IndexController extends Controller {public function index(){//@TODO 自己測試的時候,根據步驟從上到下執行每個方法即可//添加用戶、添加角色、添加權限//self::addUserRolePermission();//給用戶添加角色//self::userAddRole();//給角色添加權限//self::roleAddPermission();//給用戶添加權限self::userAddPermission();}//測試:添加測試用戶、添加測試角色、添加測試權限private static function addUserRolePermission(){$userData = [['name' => '張三', 'mobile' => '13666666666', 'password' => '123',],['name' => '李四', 'mobile' => '13888888888', 'password' => '123',],];//添加用戶$userInfo = User::insert( $userData );//添加角色$roleData = [['name' => '作家',],['name' => '讀者'],];foreach($roleData as $roleValue){$role = Role::create( $roleValue );}//添加權限$permissionData = [['name' => '新增文章'],['name' => '編輯文章'],['name' => '查看文章'],['name' => '刪除文章'],];foreach($permissionData as $permissionValue){$permission = Permission::create( $permissionValue );}echo 'ok';die;}//測試:給用戶添加角色private static function userAddRole(){//執行完此步驟,表[model_has_roles]會多一條數據,model_type=App\User:就代表是用戶 role_id:角色id model_id:用戶id$user = User::find( 1 );$res = $user->assignRole( '作家' );print_r( $res );}//測試:給角色添加權限private static function roleAddPermission(){/*** 第一種方式:給角色添加權限 @TODO 每次添加一個權限* 執行完此步驟,表[role_has_permission]會多一條數據,permission_id:權限id role_id:角色id* 給作家添加[新增文章權限]*/$role = Role::find( 1 );//$res = $role->givePermissionTo('新增文章');//print_r($res);die;/*** 第二種方式:將權限分給角色 @TODO 每次給角色添加一個權限* 給作家添加[查看文章]*/$permission = Permission::find( 2 );//$res = $permission->assignRole($role);//print_r($res);die;/*** 第三種方式:將多個權限同步到一個角色* 給作家添加[查看文章 和 刪除文章 權限]* @TODO syncPermissions 該方法會覆蓋掉角色之前所有的權限*/$permission = Permission::whereIn( 'id', [1, 2] )->get();$allPermission = $role->syncPermissions( $permission );}//測試:給用戶添加權限private static function userAddPermission(){//執行完此步驟,表[model_has_permission]會多一條數據,model_type=App\User:就代表是用戶$user = User::find( 1 );$addUserPermission = $user->givePermissionTo( '新增文章' );print_r( $addUserPermission );} }

    九、有關用戶、角色、權限方法的使用

    /*** 第一個方法 從緩存中獲取所有權限 @TODO 'spatie.permission.cache' 這個key是固定的。*/ $cachePermission = Cache::get('spatie.permission.cache');/*** 第二個方法 從角色中刪除權限:方式1(通過角色刪除)*/ $role = Role::find(1); $deleteRes = $role->revokePermissionTo('查看文章'); print_r($deleteRes->toArray());//從角色中刪除權限:方式2(通過權限刪除) $permission = Permission::find(4); $deleteRes = $permission->removeRole($role); print_r($deleteRes->toArray());$user = User::find( 1 ); //獲取某個用戶的所有權限 $permissions = $user->permissions; print_r($permissions->toArray());//獲取用戶通過角色繼承的所有權限 $permissions = $user->getAllPermissions(); print_r($permissions->toArray());//獲取某個用戶的所有角色 $roles = $user->getRoleNames(); print_r($roles);/*** @TODO 特征(trait)還為您的模型添加了一個“角色”范圍,以便將查詢范圍限定為某些角色或權限*/ //僅返回具有角色 '作家' 的用戶$user = User::role( '作家' )->get(); print_r($user->toArray());//僅返回具有 '新增文章'(繼承或直接)權限的用戶 $user = User::permission( '新增文章' )->get(); print_r($user->toArray());//可以撤銷用戶權限 $user->revokePermissionTo('新增文章'); //或者一次性撤消并添加新的權限 $user->syncPermissions(['新增文章', '刪除文章']);//測試用戶是否擁有權限 $user->hasPermissionTo('新增文章'); //或者可以傳遞一個代表權限 ID 的整數 $user->hasPermissionTo(1); $user->hasPermissionTo(Permission::find(1)->id); $user->hasPermissionTo($somePermission->id);//同時校驗用戶是否擁有多個權限(通過權限 名稱 校驗) $user->hasAnyPermission(['新增文章', '編輯文章', '刪除文章']); //同時校驗用戶是否同時擁有多個權限(通過權限 ID 校驗) $user->hasAnyPermission(['新增文章', 2, 4]);//校驗用戶是否具有某個角色 $user->hasRole('作家'); //還可以確定用戶是否具有任何給定的角色列表 $user->hasAnyRole(Role::all()); //還可以確定用戶是否具有所有給定的角色列表 $user->hasAllRoles(Role::all());//可以給角色一個許可 $role->givePermissionTo('編輯文章'); //確定角色是否具有某種權限 $role->hasPermissionTo('編輯文章'); //角色撤銷權限 $role->revokePermissionTo('編輯文章');//權限是從角色自動繼承的。 當讓,個人權限也可以分配給用戶 $role = Role::findByName('作家'); $role->givePermissionTo('編輯文章'); $user->assignRole('作家'); $user->givePermissionTo('刪除文章'); 在上面的示例中,角色被授予編輯文章的權限,并且該角色被分配給用戶。 現在,用戶可以編輯文章并刪除文章。 ‘刪除文章’ 的權限是用戶的直接許可,因為它直接分配給他們。 當我們調用 $user->hasDirectPermission('刪除文章') 時,它會返回 true 而對 $user->hasDirectPermission('編輯文章') 返回 false。//如果你為應用程序中的角色和用戶構建權限并希望限制或更改用戶角色的繼承權限(即僅允許更改用戶的直接權限),則此方法非常有用。//直接權限 $user->getDirectPermissions(); 或者使用 $user->permissions //從用戶角色繼承的權限 $user->getPermissionsViaRoles(); //適用于用戶的所有權限(繼承和直接) $user->getAllPermissions(); 所有這些響應都是 Spatie\Permission\Models\Permission 對象的集合。

    十、權限中間件的使用

    laravel-permission擴展附帶 RoleMiddleware 和 PermissionMiddleware 中間件。 你可以將它們添加到你的 app/Http/Kernel.php 文件中。

    'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class, 'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,

    然后,你可以使用中間件規則保護你的路由:

    #例如 Route::group(['middleware' => ['role:super-admin']], function () { // }); Route::group(['middleware' => ['permission:刪除文章']], function () { // }); Route::group(['middleware' => ['role:super-admin','permission:刪除文章']], function () { // });或者,您可以用 |(管道)字符分隔多個角色或權限 Route::group(['middleware' => ['role:super-admin|作家']], function () { // }); Route::group(['middleware' => ['permission:新增文章|編輯文章']], function () { // });

    通過在構造函數中設置所需的中間件,可以同樣保護您的控制器

    public function __construct() {$this->middleware( ['role:超級管理員', 'permission:刪除文章|編輯文章'] ); }

    十一、使用 artisan 命令操作權限

    可以使用 artisan 命令從控制臺創建角色或權限

    php artisan permission:create-role 作家php artisan permission:create-permission "新增文章"

    在為特定守衛創建權限和角色時,可以將守衛名稱指定為第二個參數

    php artisan permission:create-role 作家 webphp artisan permission:create-permission "新增文章" web

    十二、權限緩存的使用

    當你使用提供的方法來操作角色和權限時,緩存會自動為您重置

    $user->assignRole('作家'); $user->removeRole('作家'); $user->syncRoles(params); $role->givePermissionTo('編輯文章'); $role->revokePermissionTo('編輯文章'); $role->syncPermissions(params); $permission->assignRole('作家'); $permission->removeRole('作家'); $permission->syncRoles(params);

    但是,如果直接在數據庫中操作“權限/角色”數據而不是調用提供的方法,則除非手動重置緩存,否則不會在應用程序中看到反映的更改。

    要手動重置此軟件包的緩存,請運行:

    php artisan cache:forget spatie.permission.cache

    總結

    以上是生活随笔為你收集整理的laravel5.5.50之权限(laravel-permissions)的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。