Laravel5.1框架自帶權限控制系統(tǒng) ACL用法分析
本文實例講述了Laravel5.1框架自帶權限控制系統(tǒng) ACL用法。分享給大家供大家參考,具體如下:
Laravel在5.1.11版本中加入了Authorization,可以讓用戶自定義權限,今天分享一種定義權限系統(tǒng)的方法。
1. 創(chuàng)建角色與權限表
使用命令行創(chuàng)建角色與權限表:
php artisan make:migration create_permissions_and_roles --create=permissions
之后打開剛剛創(chuàng)建的文件,填入下面的代碼:
public function up() { Schema::create('roles', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('label'); $table->string('description')->nullable(); $table->timestamps(); }); Schema::create('permissions', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('label'); $table->string('description')->nullable(); $table->timestamps(); }); Schema::create('permission_role', function (Blueprint $table) { $table->integer('permission_id')->unsigned(); $table->integer('role_id')->unsigned(); $table->foreign('permission_id') ->references('id') ->on('permissions') ->onDelete('cascade'); $table->foreign('role_id') ->references('id') ->on('roles') ->onDelete('cascade'); $table->primary(['permission_id', 'role_id']); }); Schema::create('role_user', function (Blueprint $table) { $table->integer('user_id')->unsigned(); $table->integer('role_id')->unsigned(); $table->foreign('role_id') ->references('id') ->on('roles') ->onDelete('cascade'); $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade'); $table->primary(['role_id', 'user_id']); }); } public function down() { Schema::drop('roles'); Schema::drop('permissions'); Schema::drop('permission_role'); Schema::drop('role_user'); }
上面的代碼會創(chuàng)建角色表、權限表、角色與權限的中間表以及角色與用戶的中間表。
2. 創(chuàng)建模型
接下來使用命令行分別創(chuàng)建角色與權限模型:
php artisan make:model Permission php artisan make:model Role
然后分別打開Permission.php、Role.php 以及 User.php ,加入下面的代碼:
// Permissions.php public function roles() { return $this->belongsToMany(Role::class); }
// Role.php public function permissions() { return $this->belongsToMany(Permission::class); } //給角色添加權限 public function givePermissionTo($permission) { return $this->permissions()->save($permission); }
// User.php public function roles() { return $this->belongsToMany(Role::class); } // 判斷用戶是否具有某個角色 public function hasRole($role) { if (is_string($role)) { return $this->roles->contains('name', $role); } return !! $role->intersect($this->roles)->count(); } // 判斷用戶是否具有某權限 public function hasPermission($permission) { return $this->hasRole($permission->roles); } // 給用戶分配角色 public function assignRole($role) { return $this->roles()->save( Role::whereName($role)->firstOrFail() ); }
上面的代碼實現(xiàn)了給角色分配權限及給用戶分配角色,然后還提供了判斷用戶是否具有某角色及某權限的方法。
之后就給使用Laravel提供的Authorization來定義權限控制了,打開 /app/Providers/AuthServiceProvider.php 文件,在 boot() 中添加代碼:
public function boot(GateContract $gate) { parent::registerPolicies($gate); $permissions = \App\Permission::with('roles')->get(); foreach ($permissions as $permission) { $gate->define($permission->name, function($user) use ($permission) { return $user->hasPermission($permission); }); } }
通過上面的方法就定義好了各個權限。下面就該填充數(shù)據(jù)了。
3. 填充數(shù)據(jù)
為方便起見,這里使用 tinker 命令行工具來添加幾條測試數(shù)據(jù):
php artisan tinker
之后進入命令行,依次輸入下列命令:
// 改變命名空間位置,避免下面每次都要輸入 App namespace App // 創(chuàng)建權限 $permission_edit = new Permission $permission_edit->name = 'edit-post' $permission_edit->label = 'Can edit post' $permission_edit->save() $permission_delete = new Permission $permission_delete->name = 'delete-post' $permission_delete->label = 'Can delete post' $permission_delete->save() // 創(chuàng)建角色 $role_editor = new Role $role_editor->name = 'editor'; $role_editor->label = 'The editor of the site'; $role_editor->save() $role_editor->givePermissionTo($permission_edit) $role_admin = new Role $role_admin->name = 'admin'; $role_admin->label = 'The admin of the site'; $role_admin->save() // 給角色分配權限 $role_admin->givePermissionTo($permission_edit) $role_admin->givePermissionTo($permission_delete) // 創(chuàng)建用戶 $editor = factory(User::class)->create() // 給用戶分配角色 $editor->assignRole($role_editor->name) $admin = factory(User::class)->create() $admin->assignRole($role_admin->name)
上面我們創(chuàng)建了兩個權限:edit-post 和 delete-post,然后創(chuàng)建了 editor 和 admin 兩個角色,editor 角色擁有 edit-post 的權限,而 admin 兩個權限都有。之后生成了兩個用戶,分別給他們分配了 editor 和 admin 的角色,即:ID 1 用戶擁有 editor 角色,因此只有 edit-post 權限,而 ID 2 用戶擁有 admin 角色,因此具有 edit-post 和 delete-post 權限。下面我們來驗證下是否正確。
打開 routes.php 文件:
Route::get('/', function () { $user = Auth::loginUsingId(1); return view('welcome'); })
上面我們先驗證 ID 1 用戶的權限,然后修改 /resources/views/welcome.blade.php 文件:
<!DOCTYPE html> <html> <head> <title>Laravel</title> </head> <body> <h1>權限測試</h1> <p> @can('edit-post') <a href="#" rel="external nofollow" rel="external nofollow" >Edit Post</a> @endcan </p> <p> @can('delete-post') <a href="#" rel="external nofollow" rel="external nofollow" >Delete Post</a> @endcan </p> </body> </html>
在視圖中我們通過 Laravel 提供的 @can 方法來判斷用戶是否具有某權限。
打開瀏覽器,訪問上面定義的路由,可以看到視圖中只出現(xiàn)了 Edit Post 鏈接。之后我們修改路由中用戶ID為 2 ,然后再次刷新瀏覽器,可以看到,這次同時出現(xiàn)了 Edit Post 和 Delete Post 兩個鏈接,說明我們定義的權限控制起作用了。
更多關于Laravel相關內(nèi)容感興趣的讀者可查看本站專題:《Laravel框架入門與進階教程》、《php優(yōu)秀開發(fā)框架總結》、《php面向對象程序設計入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家基于Laravel框架的PHP程序設計有所幫助。
- 在Laravel5中正確設置文件權限的方法
- Laravel5權限管理方法詳解
- Laravel框架實現(xiàn)的rbac權限管理操作示例
- laravel實現(xiàn)簡單用戶權限的示例代碼
- 解決laravel中日志權限莫名變成了root的問題
- laravel利用中間件做防非法登錄和權限控制示例
- Laravel5.1數(shù)據(jù)庫連接、創(chuàng)建數(shù)據(jù)庫、創(chuàng)建model及創(chuàng)建控制器的方法
- laravel5.1框架基礎之Blade模板繼承簡單使用方法分析
- Laravel5.1框架注冊中間件的三種場景詳解
- laravel5.1框架基礎之路由詳解
- laravel5.1框架model類查詢的實現(xiàn)方法
相關文章
Laravel如何實現(xiàn)適合Api的異常處理響應格式
這篇文章主要給大家介紹了關于Laravel如何實現(xiàn)適合Api的異常處理響應格式的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Laravel具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2020-06-06利用PHP將圖片轉換成base64編碼的實現(xiàn)方法
相信大家都知道Base64是網(wǎng)絡上最常見的用于傳輸8Bit字節(jié)代碼的編碼方式之一,如果對此不清楚的可以查看RFC2045~RFC2049,上面有MIME的詳細規(guī)范。這篇文章我們分享一個PHP將圖片轉換為base64編碼格式的方法,有需要的朋友們可以參考借鑒。2016-09-09掌握Laravel框架中容器的管理依賴實現(xiàn)松耦合
這篇文章主要為大家介紹了掌握Laravel框架中容器管理依賴實現(xiàn)松耦合,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10CentOS下PHP7的編譯安裝及MySQL的支持和一些常見問題的解決辦法
這篇文章主要介紹了CentOS下PHP7的編譯安裝及MySQL的支持和一些問題的解決 的相關資料,需要的朋友可以參考下2015-12-12