hero_picture
Cover Image for Laravel Jetstream チーム機能を使ったユーザ管理機能の実装

Laravel Jetstream チーム機能を使ったユーザ管理機能の実装

2023/06/01

初めまして、システム開発事業部のイマイです。

今回はLaravel Jetstream3.*のチーム機能を触ってみたので、その内容をインストール方法からまとめてみたいと思います。

💡
Laravel Jetstreamとは、Laravelアプリケーションのスカフォールドであり、アプリケーションのログイン、登録、メール認証、二要素認証、セッション管理、Laravel Sanctumを介したAPI、そしてオプションのチーム管理機能の実装を提供します。

目次

チーム機能とは

チーム機能は、LaravelのJetstreamというパッケージの一部として提供されています。
Jetstreamのチーム機能を使用すると、ウェブアプリケーション内でチームを作成し、ユーザーをチームに招待して、共同でプロジェクトやタスクを管理することができます。

インストール

早速インストールしていきましょう。
今回はLaravel sailで環境構築を行いますので、Dockerが必要になります。
Dockerがインストールされているのを前提として進めていきます。

Laravelプロジェクトを作成
curl -s https://laravel.build/team-test | bash

team-testの部分は任意のプロジェクト名に変更してください。

作成したプロジェクト内に移動
cd team-test/

Sailの立ち上げ
./vendor/bin/sail up

私の環境の場合、デフォルトの80ポートが使用されていたので、.envに下記のように記述して8080ポートを使用するように変更しました。

1APP_PORT=8080

一旦ブラウザで下記へアクセスして、LaravelのWelcome画面が表示されることを確認できたら、Laravelのインストールは完了です。(ポートを変更した場合はそのポート番号に変更する)

http://localhost:80/

続いて、Jetstreamインストールを行います。

JetstreamにはLivewireinertiaがありますが、今回はLivewireを使用します。
 
Livewire:テンプレート言語にLaravel Bladeを使用するエディション
 inertia:テンプレート言語にVue.js を使うエディション

Jetstreamのインストール
./vendor/bin/sail composer require laravel/jetstream

livewireとチーム機能を有効にしてインストール
./vendor/bin/sail artisan jetstream:install livewire --teams

パッケージのインストールとビルド
./vendor/bin/sail npm install && ./vendor/bin/sail npm run build

マイグレーション実行
./vendor/bin/sail artisan migrate

チーム機能を有効にすると、「teams」と「team_user」と「team_invitations」の3つのテーブルが追加で作成されます。

ここまで完了したら、もう一度ブラウザで下記へアクセス

http://localhost:80/

画面右上に「Login」と「Register」のリンクが表示されていれば、無事にJetstreamのインストールが完了しています。

チーム機能の紹介

早速、画面右上の「Register」からアカウントを作成してみます。

アカウント作成後、ダッシュボードの画面右上に登録したユーザー名と、チーム名が表示されていることが確認できます。

新規登録時は自分1人だけのパーソナルチームが自動で作成されます。

チーム名をクリックすると、Team SettingsCreate New Teamの2つのタブが表示されます。

Team Settingsでは、チーム名の変更、チームメンバーの招待、メンバーの削除・権限の変更、チームの削除(パーソナルチームは削除不可)を行うことができます。

Team Settingsページ
Team Settingsページ

Create New Teamでは、新規チームの作成ができます。
ユーザーは複数のチームの作成・所属することができ、それぞれのチームで別の役割を持つことができます。

Create New Teamページ
Create New Teamページ

権限のカスタマイズ方法

役割を増やしたり、権限の変更をすることができます。

権限(role)のカスタマイズは、app/Providers/JetstreamServiceProvider.phpで行うことができます。

デフォルトでは、「Administrator」と「Editor」が定義されています。

Jetstream::roleの引数については、下記のようになっています。
 
1つ目:役割を一意に識別するための識別子
 2つ目:ユーザーに表示される役割の名前
 3つ目:役割に関連付ける権限(Permissions)の配列

試しに、manage権限を持った、Managerという役割を追加してみます。

1Jetstream::role('manager', 'Manager', [
2    'manage'
3])->description('Manager users have the ability to manage.');

すると、Roleの欄にManagerが追加されていることが確認できます。

次に、せっかく役割を追加したので、Managerの権限を設定してみます。

app/Policies/TeamPolicy.phpaddTeamMemberメソッドを以下のように変更します。

1public function addTeamMember(User $user, Team $team): bool
2{
3    return $user->ownsTeam($team) || $user->HasTeamPermission($team, 'manage');
4}

こうすることで、本来はチームのオーナー(作成者)しかチームメンバーの招待は行えないのですが、manage権限を持つ役割のユーザーもチームメンバーの招待が行えるようになります。

権限カスタマイズの動作確認

実際にManagerがチームメンバーの招待が行えるようになったか確認してみます。

まず、Managerロールのユーザーが必要なので、新たにチームにユーザーを招待します。
「TeamSettings」画面の「Add Team Member」で、メールアドレスと、先程作成した
Managerを選択して「Add」ボタンを押すと、招待メールが送信されます。

招待されたユーザーは、届いたメールから招待を承認することができます。
Laravel Sailには、
Mailpitという開発用メールサーバーが用意されているので、下記のURLにアクセスすることでメールを確認することができます。

http://localhost:8025

チームの招待を受けると、Teamタブに自分のパーソナルチームと招待されたチームが表示され、ここからチームを切り替えることができます。

招待されたチームを選択し、「Team Settings」ページに移動するとチームの招待が行えるようになっていることが確認できました。

Managerでログインしている場合
Managerでログインしている場合

ちなみにmanage権限を持たないユーザーの場合は、チームメンバーの招待は行えないようになっています。

Editorでログインしている場合
Editorでログインしている場合

以上で、カスタマイズした内容が正常に反映されていることが確認できました。

終わりに

今回は簡単にチーム機能の紹介をしましたが、
権限周りをカスタマイズしていくことで、より複雑な実装も実現できそうです。

また、今回紹介したのはJetstreamのチーム機能の一部ですので、興味のある方は公式ドキュメントを参照してみてください。

https://jetstream.laravel.com/3.x/features/teams.html