【Laravel】既存の認証をメールアドレスからユーザ名に変更する

こんにちは、おてらです。

Laravel の標準の認証周りについて一通り勉強したので記録。

スポンサーリンク

Laravel標準の認証機能を追加

Djangoにもありますが、Laravelにも標準でユーザ認証の機能が用意されています。以下のコマンドで追加できます。

$ php artisan make:auth

これによりログイン、ログアウト、ユーザ登録の処理に対するルーティングが自動的に登録されます。

デフォルトの動作から変更

公式ドキュメントによると

デフォルトでLaravelはemailフィールドを認証に利用します。これをカスタマイズしたい場合は、LoginControllerusernameメソッドを定義してください。

ということで App\Http\Controllers\Auth\LoginController.php に以下の記述を追加しろと書いてあります。

public function username()
{
    return 'username';
}

しかし僕の環境じゃこれでは上手くいきませんでした。

よくよく調べてみると、リターンすべきカラムの名前が違っていました。

Usersテーブルを作成するマイグレーションファイルを見てみると以下のようになっています。

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

username ちゃうやんけ!! name やんけ!!!(^○^)

 

というわけで正しくは

public function username()
{
return 'name';
}

こう直す必要がありました。

bladeファイルの編集

あとはテンプレートのHTMLを修正すれば name でログインできるようになるはず。

login.blade.php の14行目辺りを以下のように変更すればOKです。

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

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

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

単純に email で指定されていた箇所を name に置換しただけですね。

名前でログインすると

ちゃんと右上に name が表示されています。

終わり

フレームワークで認証機能を用意してくれているのは非常に助かるんですが、アプリケーションを作るうえではやはりカラムが足りなかったりと、そのまま使うことはほとんどないと思うのでこういったカスタマイズに関するドキュメントをもっと充実させて欲しいなと願う今日この頃です。

本読みながら1日ぐらい悩んだ…。

フォローする

スポンサーリンク