[PHP]Laravelでメールアドレスでもユーザー名(ログインID)でもログインできるようにする

Pocket

Laravel ではコンソールで、

php artisan make:auth
とするだけで管理画面を作ることができますが、初期状態ではメールアドレスとパスワードを使ってログインする構造になっています。そこで、メールアドレスだけでなくログインIDでもログインできるように改造します。

今回使用するバージョンは 5.6 です。


まずはデータベースのテーブル users にログインIDを保存するためのカラム login を追加します。
マイグレーションを行う場合は次のようになります。

CreateUsersTable

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

ログイン名は重複のないもので、英数字が入るものとします。ここではシーディングでユーザーを追加します。

php artisan make:seeder UsersTableSeeder
	public function run()
    {
        DB::table('users')->insert([
            'name' => 'User 1',
            'login' => 'user1',
            'email' => 'user1@example.com',
            'password' => bcrypt('secret')
        ]);
    }

ログインに関係する処理は App\Http\Controllers\Auth\LoginController に書かれています。
実際には Illuminate\Foundation\Auth\AuthenticatesUsers の内容をオーバーライドしているだけなので AuthenticatesUsers の中身を見て動きを調べ、LoginController に実装することで上書きします。

追加するメソッドは次の2つです。「use Illuminate\Http\Request;」を上部に追記するのを忘れないで下さい。

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

    protected function attemptLogin(Request $request)
    {
        $username = $request->input($this->username());
        $password = $request->input('password');

        if (filter_var($username, \FILTER_VALIDATE_EMAIL)) {
            $credentials = ['email' => $username, 'password' => $password];
        } else {
            $credentials = [$this->username() => $username, 'password' => $password];
        }

        return $this->guard()->attempt($credentials, $request->filled('remember'));
    }

ログインフォームから login の入力値を受け取り、メールアドレスであれば email を調べ、そうでなければ login を調べてログインする仕組みです。

input の name を変更したのでビューも修正します。場所は resources/views/auth/login.blade.php です。

<div class="form-group row">
	<label for="login" class="col-sm-4 col-form-label text-md-right">{{ __('Username / E-Mail Address') }}</label>

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

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

email となっていた箇所を login に置き換えました。type は text に変更となります。

これでメールアドレス、ログインIDのどちらでもログインできるようになります。


Similar Posts:




コメントを残す

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