@if (Auth::check()) 我的名字是 '{{ Auth::user()->name }}', id 為 '{{ Auth::user()->id }} ' @else 未授權, 請登入會員!!! @endif
我有 {{ $rolesCount }} 個角色 @foreach($roles as $key => $value)
我有 {{ $permissionsCount }} 個權限 @foreach($permissions as $key => $value)
# laravel 使用者角色權限 功能實測 @ver 0.1.2 @date 2019-04-01 10:27:38 (星期一) @ver 0.1.1 @date 2019-03-16 20:04:16 (星期六) [Associate users with permissions and roles 套件](https://github.com/spatie/laravel-permission) > role : 角色 > > permission : 權限 > > Associate users with roles and permissions : 整合使用者的角色及權限 999. ## 開始 ### 安裝 > 繼續上一個專案 testAuth #### 命令及說明 ```shell # 進入專案 cd ~/jobs/testAuth # 安裝 spatie/laravel-permission composer require spatie/laravel-permission # 等待約 60 秒, 出現命令列提示符號, 查看剛剛加入的套件 ls -l vendor/spatie/ ``` #### 執行結果 ```shell [alex@nvda ~/jobs/testAuth ]$ composer require spatie/laravel-permission Using version ^2.36 for spatie/laravel-permission ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing spatie/laravel-permission (2.36.1): Downloading (100%) Writing lock file Generating optimized autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi Discovered Package: beyondcode/laravel-dump-server Discovered Package: fideloper/proxy Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Discovered Package: spatie/laravel-permission Package manifest generated successfully. [alex@nvda ~/jobs/testAuth ]$ ls -l vendor/spatie/ # drwxr-xr-x 10 alexkuo staff 340 3 17 10:17 laravel-permission ``` ### providers 引用 Spatie 打開 `config/app.php` , 先搜尋 `Spatie\Permission\PermissionServiceProvider::class,` 此段程式碼, 是否已被自動加入到 `providers` 的陣列裡, 若沒有則自行加入, 置於此陣列的最後一行即可 #### 命令 ```bash vi config/app.php ``` #### 執行結果 ```shell 'providers' => [ ... Spatie\Permission\PermissionServiceProvider::class, ], ``` ### Spatie\Permission 的 migration 用下列命令生成 migration 用的檔案 #### 命令 ```bash php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations" ``` #### 執行結果 ```shell [alex@nvda ~/jobs/testAuth ]$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations" Copied File [/vendor/spatie/laravel-permission/database/migrations/create_permission_tables.php.stub] To [/database/migrations/2019_03_18_105704_create_permission_tables.php] Publishing complete. [alex@nvda ~/jobs/testAuth ]$ ``` 使用 `git st` , 我們發現增加了一個 migration 檔案, 名為 `database/migrations/2019_03_18_105704_create_permission_tables.php` , `public function up()` 裡面有 5 個 tables , 整理如下所示 #### 資料表清單 ```shell $tableNames['role_has_permissions']); $tableNames['model_has_roles']); $tableNames['model_has_permissions']); $tableNames['roles']); $tableNames['permissions']); ``` ### migrate #### 命令 ```bash php artisan migrate --seed php artisan migrate:fresh --seed # 注意 : 所有資料庫會全部還原重設 ``` 如果成功, 資料庫會增加上述的 5 個 tables #### 執行結果 ```shell # 進入 mysql mysql> show tables; +-------------------------+ | Tables_in_alex_testauth | +-------------------------+ | migrations | | model_has_permissions | | model_has_roles | | password_resets | | permissions | | role_has_permissions | | roles | | users | +-------------------------+ 8 rows in set (0.00 sec) ``` ### Spatie\Permission 的 config 使用以下命令生成 config 用的檔案 #### 命令 ```bash php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config" ``` #### 執行結果 ```shell [alex@nvda ~/jobs/testAuth ]$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config" Copied File [/vendor/spatie/laravel-permission/config/permission.php] To [/config/permission.php] Publishing complete. [alex@nvda ~/jobs/testAuth ]$ ``` 用 `git st` , 又多了一個設定檔, 檔名為 `config/permission.php` , 這個檔設定對應使用 `table_name, cache` 等相關訊息, 現在先直接用這個檔的預設值, 暫不修改. ### use Spatie\Permission 套件 因為 `Spatie\Permission` 是跟 `User Model` 綁在一起, 要使用此套件提供的各項功能, 先在 `app/User.php` 加入 `use Spatie\Permission\Traits\HasRoles;` 及 class 裡的 `use HasRoles;` 讓後續程式可以直接取用. #### 命令 ```bash vi app/User.php ``` #### app/User.php 程式碼 ```php forgetCachedPermissions(); // 建立權限方法一, 各類角色使用的權限 Permission::create(['name' => '新增留言']); Permission::create(['name' => '刪除自己留言']); Permission::create(['name' => '刪除他人留言']); Permission::create(['name' => '救回所有留言']); // 建立權限方法一, 單獨存在的權限 Permission::create(['name' => '特異功能']); // // 建立權限方法二, 使用陣列建立權限. (先用方法一來實驗) // $permissions = [ // '新增留言', // '刪除自己留言', // '刪除他人留言', // '救回所有留言', // '特異功能', // ]; // foreach ($permissions as $permission) { // Permission::create(['name' => $permission]); // } // 建立角色, 並賦于權限 $role1 = Role::create(['name' => '討論管理者']); $role1->givePermissionTo('新增留言'); $role1->givePermissionTo('刪除自己留言'); $role1->givePermissionTo('刪除他人留言'); $role1->givePermissionTo('救回所有留言'); $role2 = Role::create(['name' => '一般會員']); $role2->givePermissionTo('新增留言'); $role2->givePermissionTo('刪除自己留言'); // 用 where 條件取出角色, 給他們對應的角色或權限, 數量不限 $user = App\User::where('email', 'a@b.com')->first(); $user->assignRole('討論管理者'); $user->givePermissionTo('特異功能'); $user = App\User::where('email', 'b@c.com')->first(); $user->assignRole('一般會員'); } } ``` `DatabaseSeeder.php` 也別忘了要加 `PermissionsSeeder::class` 到 `call([...])` #### 命令 ```bash vi database/seeds/DatabaseSeeder.php ``` #### 執行結果 ```php public function run() { $this->call([ UsersTableSeeder::class, PermissionsSeeder::class, ]); } ``` 完成 Seeder 類別的編寫, migrate 前, 必須使用 `dump-autoload` 命令重新產生 Composer 的自動載入程式 #### 命令 ```bash composer dump-autoload ``` 因為是實驗, 讓資料庫一切重新開始, 所以一不做二不休用 `migrate:fresh --seed` 暫時省卻一些繁雜的操作步驟, 真實環境就要注意是否備份資料庫 #### 命令 ```bash php artisan migrate:fresh --seed # 注意 : 備份資料庫 ``` #### 執行結果 ```shell [alex@nvda ~/jobs/testAuth ]$ php artisan migrate:fresh --seed Dropped all tables successfully. Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table Migrating: 2019_03_18_110234_create_permission_tables Migrated: 2019_03_18_110234_create_permission_tables Seeding: UsersTableSeeder Seeding: PermissionsSeeder Database seeding completed successfully. [alex@nvda ~/jobs/testAuth ]$ ``` 如果成功, 進入 mysql 查看 5 個相關 tables 資料表的筆數, 看起來是沒問題. MYDATABASE 請修改成自己的資料庫名稱 #### 命令 ```bash SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema in ('MYDATABASE') ORDER BY table_name; ``` #### 執行結果 ```shell mysql> SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema in ('MYDATABASE') ORDER BY table_name; +-----------------------+------------+ | table_name | table_rows | +-----------------------+------------+ | migrations | 2 | | model_has_permissions | 0 | | model_has_roles | 1 | | password_resets | 0 | | permissions | 5 | | roles | 2 | | role_has_permissions | 6 | | users | 2 | +-----------------------+------------+ 8 rows in set (0.01 sec) mysql> ``` 999. ## 看看權限有沒有, 角色有沒有 ### blade 的應用 我們先拿前端 blade 開刀, 現在動 `welcome.blade.php` 它即可, 只要改一點點, 就是 body 裡 `