LoginSignup
12
23

More than 5 years have passed since last update.

Laravelの認証機能をカスタマイズする

Last updated at Posted at 2018-11-10

Laravelの認証機能をカスタマイズする

Laravelには、「laravelの認証機能を試す」のように、認証機能が備わっていますが、業務で使うために少しカスタマイズする必要があります。
ここでは、この機能について以下の2点への対応をしたいと思います。

・メールアドレスでの認証を、ユーザIDに変更する。
・ゲストユーザ、一般ユーザと管理者でサイトを制限するために、ロールを追加する。

1.ユーザマスタを変更する

まずは、認証用のテーブル(users)にカラムを追加します

(1)マイグレーションファイルを作成する。

コマンドプロンプトを開いて、プロジェクトのフォルダに移動して以下のコマンドを実行します。

php artisan make:migration update_users_table --table=users

(2)マイグレーションファイルを編集する。

database\migrationsに、「XXXX_XX_XX_XXXXXX_update_users_table.php」というファイルが作成されています。
これを編集し、up, downに「userid」「role」を追加します。

database\migrations\2018_10_27_074348_update_users_table.php
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('userid')->unique()->after('email');
            $table->tinyInteger('role')->default(0)->after('password')->index('index_role')->comment('ロール');
        });
    }
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('userid');
            $table->dropColumn('role');
        });
    }

(3)マイグレーションを実行する。

コマンドプロンプトを開いて、プロジェクトのフォルダに移動して以下のコマンドを実行します。

cmd.prompt
php artisan migrate

以上でusersテーブルの変更が完了です。

2.Controllerを修正する

(1)Controllerを修正する

LoginControllerの最後に、username function を追加して、useridを返すようにします。

app\Http\Controllers\Auth\LoginController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
・・・
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    /**
    * add
    */
    public function username()
    {
        return 'userid';
    }
}

3.Registerを修正

(1)formファザードをプロジェクトに追加する

ユーザマスタを登録する画面にuseridとroleを追加していきます。roleは「guest, user, admin」
の3種類をから、selectBoxによる選択で入力をさせます。selectBoxはformファザードを使いたいので

・コマンドプロンプトから、formファザードをプロジェクトに追加します。

command.prompt
composer require "laravelcollective/html"

・formファザードを有効にする

続いて、templateでformファザードを使えるようにconfig\app.phpを編集します。

config/app.php
  'providers' => [
    // ...
    Collective\Html\HtmlServiceProvider::class,
    // ...
  ],

   'aliases' => [
    // ...
      'Form' => Collective\Html\FormFacade::class,
      'Html' => Collective\Html\HtmlFacade::class,
    // ...
  ],

(2)Registerを編集します。

Registerの画面に、userid,roleを追加します。

resources\views\auth\register.blade.php
                        <div class="form-group row">
                            <label for="userid" class="col-md-4 col-form-label text-md-right">{{ __('userid') }}</label>

                            <div class="col-md-6">
                                <input id="userid" type="text" class="form-control{{ $errors->has('userid') ? ' is-invalid' : '' }}" name="userid" value="{{ old('userid') }}" required autofocus>

                                @if ($errors->has('userid'))
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $errors->first('userid') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

<!--
・・・・
-->

                        <div class="form-group row">
                            <label for="role" class="col-md-4 col-form-label text-md-right">{{ __('role') }}</label>

                            <div class="col-md-6">
                                {{Form::select('role', ['admin', 'user', 'guest'], null, ['class' => 'form-control'])}}
                                @if ($errors->has('role'))
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $errors->first('role') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

(3)useridによる認証を有効にする。

・app\User.phpのfillable に、userid, roleを追加します。

app\User.php
    protected $fillable = [
        'name', 'userid', 'role', 'email', 'password',
    ];

(4)ログイン画面で認証をメールアドレスから、useridに変更にする。

resources/views/auth/login.blade.phpを編集して、メールアドレスをuseridに変更します。

resources/views/auth/login.blade.php
                        <div class="form-group">
                            <label for="userid" class="col-form-label">ユーザID</label>
                            <div class="">
                                <input id="userid" type="text" class="form-control{{ $errors->has('userid') ? ' is-invalid' : '' }}" name="userid" value="{{ old('userid') }}" required autofocus>
                                @if ($errors->has('userid'))
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $errors->first('userid') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

(5)RegisterControllerにuseridを追加する

createメソッドにuseridを設定するよう編集します。
※2018/12/4追加しました。

app\Http\Controllers\Auth\RegisterController.php
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'userid' => $data['userid'], // 追加
            'password' => Hash::make($data['password']),
        ]);
    }

これでユーザIDでログインして、roleによる権限でアプリの制御ができるようになります。

12
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
23