[Laravel5.5でREST API + SPA] JWTAuthでのAPI認証にRole機能を追加する

ユーザの種類によって許可するメソッドを分けたい

ユーザの種類って1種類だけってことはまずないですよね。
少なくとも一般ユーザと管理者の2種類は必要になるケースがほとんどだと思います。
そういった場合に必要なRole機能をLaravel + JWTAuthで実装する方法をご紹介します。

関連記事 : [Laravel5.5でREST API + SPA] API認証を実装する (JWTAuth) バックエンド編

ちなみに、JWTAuthでのAPI認証自体の記事はけっこう数がありますが、
そこにRole機能をプラスする方法を紹介している記事は見当たりませんでした。
この記事がお役に立てれば幸いです。

 

JWTAuthがやっている処理を確認してみる

APIのルーティングのここでJWTAuthをミドルウェアとして噛ませているわけですね。

このjwt.authというエイリアスは
以下のようにKernel.phpでvendorのクラスと紐づけられています。

ここですね。
Tymon\JWTAuth\Http\Middleware\Authenticate::class
が登録されています。
その中身が以下。

ほぼ親クラスのメソッドを実行しているだけなので親も見てみます。

どうやらこのBaseMiddlewareクラスのauthenticateメソッドとcheckForTokenメソッドが
ルーティングにおけるJWTAuthの認証処理の実体のようです。
このことを踏まえて次項に進みます。

 

DBにユーザのロールを扱うカラムを追加

処理実装の前に、ともあれusersテーブルにロールカラムが必要なので追加します。

これでusersテーブルにroleカラムがデフォルト値0で作成されました。
このroleカラムの値で権限を判定します。

 

JWTAuthのクラスを独自クラスで継承・拡張

では、権限での認証処理を実装していきます。
app/Http/Middleware/ ディレクトリに JWTAuthenticateExtended.phpを新規作成し、ひとまずJWTAuthのほうのAuthenticateクラスを継承します。

とりあえず親と全く同じメソッドを持っているだけの状態です。

そして、こっちのクラスのほうをミドルウェアとして利用したいので、
Kernel.phpに新しいエイリアスを追加しましょう。

これで「jwt.auth.extended」というミドルウェアをルーティングで利用できるようになりました。
api.phpのほうでこっちのミドルウェアに変更しつつ、
handleメソッドの引数に「どのロールで絞り込むか」を指定できるようにします。

「jwt.auth.extended」の後ろに「:admin」を付けました。
これでhandleメソッドの第3引数に「admin」という文字列が入ってきますので

$role変数で受け取ります。

そして、ログイン中のユーザのroleカラムの値に応じて処理を追加したいわけですね。
ユーザオブジェクトは

このメソッドの戻り値で取得できますので、実装は以下のようになります。
※ 管理者ユーザはroleカラムに99が格納されていることとします。

これで、roleカラムが99であるユーザのみが認証に通るようになりました。
usersテーブルの値をいじってcurlなどで動作確認してみてください。

ルーティング側の引数とhandleメソッド内の分岐の組み合わせで、自由にrole認証ができるかと思います。
適宜お役立てください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連する投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る