[Laravel8.15.0]Jetstreamによる権限付与

middlewareでユーザーroleを判定して出し分けようかと考えていたが、Laravel8系から実装された新機能として、Jetstreamチーム版でユーザの役割・権限を簡単に設定できるそうなので、それを使ってみて、Jetstreamが良いかMiddleware制御が良いか判断したい。

jetstream付きでインストールするにはインストーラーでインストールする必要がある為、

$ composer global require laravel/installer
$ export PATH=”/home/vagrant/.config/composer/vendor/bin:$PATH”
$ laravel new jettest –jet
$ cd jettest
$ php artisan –version
Laravel Framework 8.15.0

mysql> create database jetstream;
.env

1
DB_DATABASE=jetstream

$ php artisan migrate
mysql> show tables;
+————————+
| Tables_in_jetstream |
+————————+
| failed_jobs |
| migrations |
| password_resets |
| personal_access_tokens |
| sessions |
| team_user |
| teams |
| users |
+————————+
8 rows in set (0.00 sec)
-> teams, team_user テーブルが出来ている

mysql> describe teams;
+—————+—————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+—————+—————–+——+—–+———+—————-+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| user_id | bigint unsigned | NO | MUL | NULL | |
| name | varchar(255) | NO | | NULL | |
| personal_team | tinyint(1) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+—————+—————–+——+—–+———+—————-+
6 rows in set (0.00 sec)

// Team版のLivewireをインストール
$ php artisan jetstream:install livewire –teams
$ npm install && npm run dev
$ php artisan serve –host 192.168.33.10 –port 8000

register
L 2つのユーザを作成します。

hpscript
hpscript@gmail.com

yamada
yamada@gmail.com

login後
manage team “Team Settings, Create New Team”が追加されています。

### Team Setting
Team Name: Let’s Go
Add Team Member: メンバーのEmailを追加

### 役割、権限の編集
– “general”の権限を追加します
app/Providers/JetstreamServiceProvider.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
protected function configurePermissions()
    {
        Jetstream::defaultApiTokenPermissions(['read']);
 
        Jetstream::role('admin', __('Administrator'), [
            'create',
            'read',
            'update',
            'delete',
        ])->description(__('Administrator users can perform any action.'));
 
        Jetstream::role('editor', __('Editor'), [
            'read',
            'create',
            'update',
        ])->description(__('Editor users have the ability to read, create, and update.'));
 
        Jetstream::role('general', __('General'), [
            'general',
        ])->description(__('General'));
    }

Roleにgeneralが追加されました。

hpscript@gmail.comでログインして、yamada@gmail.comを”general”のroleで追加します。

mysql> select * from team_user;
+—-+———+———+———+———————+———————+
| id | team_id | user_id | role | created_at | updated_at |
+—-+———+———+———+———————+———————+
| 1 | 1 | 2 | general | 2020-11-18 05:37:18 | 2020-11-18 05:37:18 |
+—-+———+———+———+———————+———————+
1 row in set (0.00 sec)

resources/views/test.blade.php

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>jetstream test</h1>
</body>
</html>

routes/web.php

1
Route::get('/test', '\App\Http\Controllers\TestController@index');

$ php artisan make:controller TestController

app/Http/Controllers/TestController.php

1
2
3
4
5
6
7
8
class TestController extends Controller
{
    //
    public function index()
    {   
        return view('test.index');
    }
}

app/Http/Controllers/TestController.php

1
2
3
4
5
6
7
8
9
public function index(Request $request)
    {   
        $team = $request->user()->currentTeam;
 
        if(auth()->user()->hasTeamPermission($team, 'read')){
            return view('test');
        }
        return view('dashboard');
    }

yamadaでログインして、current teamをlet’s goにする。

そして、/testを叩くと、dashboardにリダイレクトされる。

簡単なのかややこしいのかわからんが、roleって概念だから、teamとはちょっと違う気がするんだような。
さて、頑張って設計書作るかー モチベーションを上げないと。。。