[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

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

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

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<h1>jetstream test</h1>
</body>
</html>

routes/web.php

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

$ php artisan make:controller TestController

app/Http/Controllers/TestController.php

class TestController extends Controller
{
    //
    public function index()
    {    
        return view('test.index');
    }
}

app/Http/Controllers/TestController.php

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とはちょっと違う気がするんだような。
さて、頑張って設計書作るかー モチベーションを上げないと。。。