laravel5.5.50之权限(laravel-permissions)的使用
目錄
一、安裝laravel-permissions擴展
二、生成數(shù)據(jù)庫遷移文件
三、執(zhí)行數(shù)據(jù)遷移
四、php artisan migrate 生成的表
五、生成配置信息
六、permission.php 文件的使用和說明
七、在user模型下加載角色相關(guān)信息
八、測試角色、權(quán)限
九、有關(guān)用戶、角色、權(quán)限方法的使用
十、權(quán)限中間件的使用
十一、使用 artisan 命令操作權(quán)限
十二、權(quán)限緩存的使用
一、安裝laravel-permissions擴展
#不指定安裝版本的命令 composer require spatie/laravel-permission#指定安裝版本的命令 composer require "spatie/laravel-permission:~2.7"?說明:~2.7是安裝的版本,因為需要根據(jù)框架的版本選擇permission擴展的版本(根據(jù)個人框架版本來選擇。我安裝的是2.7版本)
二、生成數(shù)據(jù)庫遷移文件
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"?執(zhí)行完生成遷移文件命令,就會在 \database\migrations 目錄下,生成一個以_create_permission_tables.php 結(jié)尾的文件。
三、執(zhí)行數(shù)據(jù)遷移
php artisan migrate?如果MySQL版本低,執(zhí)行完命令就會報錯,錯誤如下
意思就是:MySQL版本低,列的字段長度太長。
解決方法:修改app里的providers里的AppServiceProvider.php文件
?再次執(zhí)行:php artisan migrate 命令即可
四、php artisan migrate 生成的表
五、生成配置信息
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"?會在 config 目錄下生成一個:permission.php文件
六、permission.php 文件的使用和說明
return ['models' => [/*** @TODO 當使用這個包中的“HasPermissions”特性時,我們需要知道應(yīng)該使用哪個Eloquent模型來檢索您的權(quán)限。* 當然,它通常只是“許可”模式,但你可以使用任何你喜歡的。* 要用作權(quán)限模型的模型需要實現(xiàn)“Spatie\Permission\Contracts\Permission”契約。*/'permission' => Spatie\Permission\Models\Permission::class,/*** @TODO 當使用這個包中的“HasRoles”特性時,我們需要知道應(yīng)該使用哪個Eloquent模型來檢索角色。* 當然,它通常只是“角色”模型,但你可以使用任何你喜歡的。* 要用作角色模型的模型需要實現(xiàn)“Spatie\Permission\Contracts\Role”契約。*/'role' => Spatie\Permission\Models\Role::class,],'table_names' => [/*** @TODO 當使用這個包中的“HasRoles”特性時,我們需要知道是哪個表應(yīng)該用于檢索角色。* 我們選擇了一種基本的默認值,但您可以很容易地將其更改為任何您喜歡的表。*/'roles' => 'roles',/*** @TODO 當使用這個包中的“HasPermissions”特性時,我們需要知道是哪個表應(yīng)用于檢索您的權(quán)限。* 我們選擇了一種基本的默認值,但您可以很容易地將其更改為任何您喜歡的表。*/'permissions' => 'permissions',/*** @TODO 當使用這個包中的“HasPermissions”特性時,我們需要知道是哪個表應(yīng)該用于檢索您的模型權(quán)限。* 我們選擇了基本的默認值,但您可以輕松地將其更改為任何您喜歡的表。*/'model_has_permissions' => 'model_has_permissions',/*** @TODO 當使用這個包中的“HasRoles”特性時,我們需要知道是哪個表應(yīng)該用于檢索模型角色。* 我們選擇了基本的默認值,但您可以輕松地將其更改為任何您喜歡的表。*/'model_has_roles' => 'model_has_roles',/*** @TODO 當使用這個包中的“HasRoles”特性時,我們需要知道是哪個表應(yīng)該用于檢索角色權(quán)限。* 我們選擇了基本的默認值,但您可以輕松地將其更改為任何您喜歡的表。*/'role_has_permissions' => 'role_has_permissions',],'column_names' => [/** @ TODO 如果您希望將相關(guān)的模型主鍵命名為`model_id`.* 例如,如果您的主鍵都是uuid,這就很好了。在這種情況下,將其命名為`model_uuid`.*/'model_morph_key' => 'model_id',],/*** @TODO 當設(shè)置為true時,所需的權(quán)限/角色名稱將添加到異常中消息。* 在某些情況下,這可以被認為是信息泄露,所以為了最佳的安全性,這里的默認設(shè)置為false。*/'display_permission_in_exception' => false,'cache' => [/*** @TODO 默認情況下,所有權(quán)限都會緩存24小時,以提高性能。當權(quán)限或角色更新時,緩存會自動刷新。*/'expiration_time' => \DateInterval::createFromDateString('24 hours'),/*** @TODO 用于存儲所有權(quán)限的緩存鍵。*/'key' => 'spatie.permission.cache',/*** @TODO 當通過傳遞permission來檢查模型的權(quán)限時實例,則此鍵確定Permissions模型上的哪個屬性用于緩存。* 理想情況下,這應(yīng)該匹配您首選的檢查權(quán)限的方式,例如:`$user->can('view-posts')` 應(yīng)該是 'name'.*/'model_key' => 'name',/*** @TODO 您可以選擇使用cache.php配置文件中列出的任何“store”驅(qū)動程序來指定特定的緩存驅(qū)動程序用于權(quán)限和角色緩存。* 這里使用'default'意味著使用cache.php中的'default'設(shè)置。*/'store' => 'default',],];七、在user模型下加載角色相關(guān)信息
use HasRoles;八、測試角色、權(quán)限
#新建一個控制器 php artisan make:controller IndexController?控制器的內(nèi)容如下:
<?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 自己測試的時候,根據(jù)步驟從上到下執(zhí)行每個方法即可//添加用戶、添加角色、添加權(quán)限//self::addUserRolePermission();//給用戶添加角色//self::userAddRole();//給角色添加權(quán)限//self::roleAddPermission();//給用戶添加權(quán)限self::userAddPermission();}//測試:添加測試用戶、添加測試角色、添加測試權(quán)限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 );}//添加權(quán)限$permissionData = [['name' => '新增文章'],['name' => '編輯文章'],['name' => '查看文章'],['name' => '刪除文章'],];foreach($permissionData as $permissionValue){$permission = Permission::create( $permissionValue );}echo 'ok';die;}//測試:給用戶添加角色private static function userAddRole(){//執(zhí)行完此步驟,表[model_has_roles]會多一條數(shù)據(jù),model_type=App\User:就代表是用戶 role_id:角色id model_id:用戶id$user = User::find( 1 );$res = $user->assignRole( '作家' );print_r( $res );}//測試:給角色添加權(quán)限private static function roleAddPermission(){/*** 第一種方式:給角色添加權(quán)限 @TODO 每次添加一個權(quán)限* 執(zhí)行完此步驟,表[role_has_permission]會多一條數(shù)據(jù),permission_id:權(quán)限id role_id:角色id* 給作家添加[新增文章權(quán)限]*/$role = Role::find( 1 );//$res = $role->givePermissionTo('新增文章');//print_r($res);die;/*** 第二種方式:將權(quán)限分給角色 @TODO 每次給角色添加一個權(quán)限* 給作家添加[查看文章]*/$permission = Permission::find( 2 );//$res = $permission->assignRole($role);//print_r($res);die;/*** 第三種方式:將多個權(quán)限同步到一個角色* 給作家添加[查看文章 和 刪除文章 權(quán)限]* @TODO syncPermissions 該方法會覆蓋掉角色之前所有的權(quán)限*/$permission = Permission::whereIn( 'id', [1, 2] )->get();$allPermission = $role->syncPermissions( $permission );}//測試:給用戶添加權(quán)限private static function userAddPermission(){//執(zhí)行完此步驟,表[model_has_permission]會多一條數(shù)據(jù),model_type=App\User:就代表是用戶$user = User::find( 1 );$addUserPermission = $user->givePermissionTo( '新增文章' );print_r( $addUserPermission );} }九、有關(guān)用戶、角色、權(quán)限方法的使用
/*** 第一個方法 從緩存中獲取所有權(quán)限 @TODO 'spatie.permission.cache' 這個key是固定的。*/ $cachePermission = Cache::get('spatie.permission.cache');/*** 第二個方法 從角色中刪除權(quán)限:方式1(通過角色刪除)*/ $role = Role::find(1); $deleteRes = $role->revokePermissionTo('查看文章'); print_r($deleteRes->toArray());//從角色中刪除權(quán)限:方式2(通過權(quán)限刪除) $permission = Permission::find(4); $deleteRes = $permission->removeRole($role); print_r($deleteRes->toArray());$user = User::find( 1 ); //獲取某個用戶的所有權(quán)限 $permissions = $user->permissions; print_r($permissions->toArray());//獲取用戶通過角色繼承的所有權(quán)限 $permissions = $user->getAllPermissions(); print_r($permissions->toArray());//獲取某個用戶的所有角色 $roles = $user->getRoleNames(); print_r($roles);/*** @TODO 特征(trait)還為您的模型添加了一個“角色”范圍,以便將查詢范圍限定為某些角色或權(quán)限*/ //僅返回具有角色 '作家' 的用戶$user = User::role( '作家' )->get(); print_r($user->toArray());//僅返回具有 '新增文章'(繼承或直接)權(quán)限的用戶 $user = User::permission( '新增文章' )->get(); print_r($user->toArray());//可以撤銷用戶權(quán)限 $user->revokePermissionTo('新增文章'); //或者一次性撤消并添加新的權(quán)限 $user->syncPermissions(['新增文章', '刪除文章']);//測試用戶是否擁有權(quán)限 $user->hasPermissionTo('新增文章'); //或者可以傳遞一個代表權(quán)限 ID 的整數(shù) $user->hasPermissionTo(1); $user->hasPermissionTo(Permission::find(1)->id); $user->hasPermissionTo($somePermission->id);//同時校驗用戶是否擁有多個權(quán)限(通過權(quán)限 名稱 校驗) $user->hasAnyPermission(['新增文章', '編輯文章', '刪除文章']); //同時校驗用戶是否同時擁有多個權(quán)限(通過權(quán)限 ID 校驗) $user->hasAnyPermission(['新增文章', 2, 4]);//校驗用戶是否具有某個角色 $user->hasRole('作家'); //還可以確定用戶是否具有任何給定的角色列表 $user->hasAnyRole(Role::all()); //還可以確定用戶是否具有所有給定的角色列表 $user->hasAllRoles(Role::all());//可以給角色一個許可 $role->givePermissionTo('編輯文章'); //確定角色是否具有某種權(quán)限 $role->hasPermissionTo('編輯文章'); //角色撤銷權(quán)限 $role->revokePermissionTo('編輯文章');//權(quán)限是從角色自動繼承的。 當讓,個人權(quán)限也可以分配給用戶 $role = Role::findByName('作家'); $role->givePermissionTo('編輯文章'); $user->assignRole('作家'); $user->givePermissionTo('刪除文章'); 在上面的示例中,角色被授予編輯文章的權(quán)限,并且該角色被分配給用戶。 現(xiàn)在,用戶可以編輯文章并刪除文章。 ‘刪除文章’ 的權(quán)限是用戶的直接許可,因為它直接分配給他們。 當我們調(diào)用 $user->hasDirectPermission('刪除文章') 時,它會返回 true 而對 $user->hasDirectPermission('編輯文章') 返回 false。//如果你為應(yīng)用程序中的角色和用戶構(gòu)建權(quán)限并希望限制或更改用戶角色的繼承權(quán)限(即僅允許更改用戶的直接權(quán)限),則此方法非常有用。//直接權(quán)限 $user->getDirectPermissions(); 或者使用 $user->permissions //從用戶角色繼承的權(quán)限 $user->getPermissionsViaRoles(); //適用于用戶的所有權(quán)限(繼承和直接) $user->getAllPermissions(); 所有這些響應(yīng)都是 Spatie\Permission\Models\Permission 對象的集合。十、權(quán)限中間件的使用
laravel-permission擴展附帶 RoleMiddleware 和 PermissionMiddleware 中間件。 你可以將它們添加到你的 app/Http/Kernel.php 文件中。
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class, 'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,然后,你可以使用中間件規(guī)則保護你的路由:
#例如 Route::group(['middleware' => ['role:super-admin']], function () { // }); Route::group(['middleware' => ['permission:刪除文章']], function () { // }); Route::group(['middleware' => ['role:super-admin','permission:刪除文章']], function () { // });或者,您可以用 |(管道)字符分隔多個角色或權(quán)限 Route::group(['middleware' => ['role:super-admin|作家']], function () { // }); Route::group(['middleware' => ['permission:新增文章|編輯文章']], function () { // });通過在構(gòu)造函數(shù)中設(shè)置所需的中間件,可以同樣保護您的控制器
public function __construct() {$this->middleware( ['role:超級管理員', 'permission:刪除文章|編輯文章'] ); }十一、使用 artisan 命令操作權(quán)限
可以使用 artisan 命令從控制臺創(chuàng)建角色或權(quán)限
php artisan permission:create-role 作家php artisan permission:create-permission "新增文章"在為特定守衛(wèi)創(chuàng)建權(quán)限和角色時,可以將守衛(wèi)名稱指定為第二個參數(shù)
php artisan permission:create-role 作家 webphp artisan permission:create-permission "新增文章" web十二、權(quán)限緩存的使用
當你使用提供的方法來操作角色和權(quán)限時,緩存會自動為您重置
$user->assignRole('作家'); $user->removeRole('作家'); $user->syncRoles(params); $role->givePermissionTo('編輯文章'); $role->revokePermissionTo('編輯文章'); $role->syncPermissions(params); $permission->assignRole('作家'); $permission->removeRole('作家'); $permission->syncRoles(params);但是,如果直接在數(shù)據(jù)庫中操作“權(quán)限/角色”數(shù)據(jù)而不是調(diào)用提供的方法,則除非手動重置緩存,否則不會在應(yīng)用程序中看到反映的更改。
要手動重置此軟件包的緩存,請運行:
php artisan cache:forget spatie.permission.cache總結(jié)
以上是生活随笔為你收集整理的laravel5.5.50之权限(laravel-permissions)的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu3966 树链剖分+线段树 裸题
- 下一篇: Linux的strings命令_拔剑-浆