Laravel中級編①認証設定

以前の記事でlaravelのログイン機能の設定方法を紹介しました。しかし、同じログインをした人の中でも管理者とユーザーを区別したい、という時があると思います。そうした人のために今回は認証機能の設定の仕方を解説して行きます。ちょっと難しそうですけど簡単なので安心してください。

この記事の対象者
  • 認証について知りたい
  • 認証って何が便利なの?
  • 管理者だけに表示させる機能を追加したい

Laravel中級編② 認証設定

認証機能を使用するためにはいくつか準備をしなくてはなりません。まとめると下記の準備が必要になります。

認証機能を使うまでの手順
  • usersテーブルにroleカラムを追加
  • roleに応じたポリシーの作成
  • 認証機能を使うための呪文を記述する

まずはusersテーブルにroleカラムを追加して行きます。

これは簡単ですね。以前の記事でも紹介したTblePlusから直接カラムを増やしてもいいですが、今回はコマンドプロンプトからartisanコマンドを使って増やして行きましょう。

php artisan make:migration add_role_to_users_table

addのあとはなんでも良いですが、何のためのファイルなのか分かりやすい名前にしておきましょう。

では、add_role_to_users_tableを編集して行きましょう。

public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->tinyInteger('role')->default(0)->after('password');
        });
    }

upメソッドが完成したらコマンドプロンプトで呪文を唱えます。

php artisan migrate

無事にいけがsuccessfulというメッセジーがでてきて完了です。

AuthServiceProviderのbootを編集して行きます。

このファイルはApp/Http/Controller/Providerの中にあります。

public function boot()
    {
        $this->registerPolicies();

      // 開発者のみ許可
      Gate::define('system-only', function ($user) {
        return ($user->role == 5);
      });
      // 一般ユーザ以上(つまり全権限)に許可
      Gate::define('user-higher', function ($user) {
        return ($user->role >= 0 );
      });
    
    }

roleが5の人は開発者権限を持っていて、roleが0〜4の人は通常のユーザーという風にしてみました。今回は開発者とユーザーだけですが、もっと細かく権限を分けるときに0〜4の数字が役に立ってきます。

最後に認証機能を使うための呪文を書いて行きます。

今までは認証機能を使うための準備でした。準備が整ったら実際に使うためにViewやルーティングに組み込んで行きます。

まずはViewです。

@auth:これは認証がなくてもできますが便利なので紹介しておきます。

@auth
//ここに書くコードはログインしていないと見れないコードになります。
@endauth

@can:これは認証を設定しないとできない機能です。

@can('system-only')
//system-onlyとすることでroleが5の人しかここに書くコードが見れなくなります。
@endcan

次にルーティングです。

ミドルウェアを仕込むことでログインしている人のroleに応じてルーティングを動かしてくれるようになります。

Route::group(['middleware' => ['auth', 'can:user-higher']], function () {
    //ここに書くルートはroleが5の人にしか実行されません。
});

基本的にcanを使います。逆の使い方としてcannotがあったり、指定したいものが複数あるときにはcananyを使えばできます。

他にもログインしていない人にはguestという呪文があるのでそちらを使いましょう。

コントローラーでも制限できます。

Gateを使うことで登録したroleに応じた処理を行うことができます。

if(Gate::allows('user-higher')){

		//ユーザーが'user-higher'のみが行う処理

	}else{

		//それ以外の場合の処理

	}

Gateを使うことでコードが分かりやすくなりますね。

まとめ

今回は認証機能の使い方について紹介しました。

ウェブサービスを作る上で欠かせない機能ですが、簡単に設定できるようになっているので助かりますね。ぜひ、ログイン機能と一緒に認証機能も設定しておきましょう。

関連記事