Saba note

醜悪コード Ugly hacks ITものづくり

Laravel5のログイン時に認証条件追加

ざっくりとログインの仕組みを見てみました。認証機能についてはこちらをご覧ください。

ログイン時の条件

以下のURIからユーザー名(Eメール)とパスワードを入力すると、

/login

実際にログインの手続きを行っているのは、

Illuminate\Foundation\Auth\AuthenticatesUsers;
(vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php)

というところです。ログインしているのかしてないのかを判断してくれるところです。
実際のログイン時の関数はここですね。

protected function credentials(Request $request)
    {
        return $request->only($this->username(), 'password');
    }

ユーザーIDとパスワードをリクエストのオブジェクトとして渡してます。パスワードは文字列だけ渡して別処理してるようです。ログイン時の項目を追加したい場合は、returnの配列にお好みのカラムと値を渡してあげればよいということになります。

protected function credentials(Request $request)
    {
        // return $request->only($this->username(), 'password');
    return array_merge($request->only($this->username(), 'password'), ['role' => '1'],["active" => '1']);
    }

この場合は、roleが1、activeが1みたいな感じでカスタマイズしたカラムを参照してログインするようになります。逆にいうとroleとactiveが条件を満たしていないとログインできなくなります。

Vendor以下はいじりたくない

Laravelに限らずフレームワークの常としてVendor以下のファイルを直接触ってカスタマイズすることはおすすめしません。次の更新で該当のファイルがアップデートされるかもしれないし、composer updateで記述した内容が削除されてしまう可能性があるからです。なので、traitの内容はフロントコントローラで上書きします。

[app/Http/Controllers/Auth/LoginController.php]
<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;

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

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

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

    /* ログイン条件の変更 */
    public function credentials(Request $request)
    {
        /*
         * 通常のメンバーログインはrole + status + delflag
        */
        $authConditionsOrigin = $request->only($this->username(), 'password');
        $authConditionsCustom = array_merge(
            $authConditionsOrigin,
            ['status'=>'2'],
            ['delflag'=>'0']
        );
        return $authConditionsCustom;
    }

}

こうやっておくとtraitのメソッドを上書きしてくれます。

細かいところをみてみる

ログイン画面の表示(get)、ログインの動作(post)とログアウトという作りになってました。

path method header3
/login [GET HEAD] | App\Http\Controllers\Auth\LoginController@showLoginForm
/login [POST] App\Http\Controllers\Auth\LoginController@login
/login [POST] App\Http\Controllers\Auth\LoginController@logout

これらの表面的なコントローラは、LoginControllerではありますが、ここからuseでもって

use Illuminate\Foundation\Auth\AuthenticatesUsers;

vendorのAuthenticatesUsers.phpを呼んでそのままつかっている様子です。
なので実態は、

vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php

ということになります。
ログイン時はlogin()というメソッドをよんでいるので、そのままですね。

login()の中では、

  • validateLogin() バリデーション
  • hasTooManyLoginAttempts() 何度もアクセスがあって失敗した場合はロック
  • attemptLogin() ログインする
    • credentials() ログイン情報を渡す(emailとpassword)

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください