LoginSignup
12
10

More than 1 year has passed since last update.

Laravelでログイン機能を自作したいんですけどっ!??

Last updated at Posted at 2022-06-25

イントロ

こちらはLaravelドキュメントの認証のページを分かりやすくかみ砕いたものになります!

タイトルにある通り、今回はパッケージを使わずにLaravelでのユーザーを手動で認証する(=ログインさせる)機能を解説したいと思います!

今回解説するLaravelドキュメントはバージョン8.xです

認証と同じ意味やで

Web業界ではログインのことを「認証」や、英語で「authentication」などと言ったりします。

なのでこの先に、ログインと言わずに認証と言ったりすることがあるかも知れませんが、概ねログインのことを指していると思ってもらってOKです。

attemptメソッドを使う

Laravelで認証周りのサービスはAuthファサードを介することで実装できます。

Authファサードのattemptメソッドを用いることで、ユーザーのログイン処理をすることができます。

まずはLoginControllerを例に実装例を見てみましょう。

LoginController
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; // Authファサードを読み込んでねっ!

class LoginController extends Controller
{
    /**
     * 認証の試行を処理
     */
    public function login(Request $request)
    {
        $user_info = $request->validate([
            'email' => ['required', 'email'],
            'password' => ['required'],
        ]);

        // ログインに成功したとき
        if (Auth::attempt($user_info)) {
            $request->session()->regenerate();
            return redirect()->route('dashboard');
        }

        // 上記のif文でログインに成功した人以外(=ログインに失敗した人)がここに来る
        return redirect()->back();
    }
}

メールアドレスとパスワードを与えてあげる

Laravelのattemptメソッドにはメールアドレスとパスワードの連想配列を引数に与えてあげると、データベースにある該当ユーザーを探します。

// attemptメソッドのメールアドレスとパスワードを与える
attempt([
    'email' => '〇〇@email.com',
    'password' => '×××××××××'
]);

もう少し正確には、attemptメソッドは引数で与えられたメールアドレスを元にデータベースに該当するユーザーがいないかを確認します。

もしユーザーいた場合、今度は与えられたパスワードをattemptメソッドが自動的にハッシュ化して、それをデータベースに格納されているハッシュ化されたパスワードを比較します。

これらのパスワードも一致した場合は、ユーザーの認証セッションが開始されます(=ログインが成功します)。

なのでattemptメソッドに与えるパスワードは生のままでよく、ハッシュ化させなくて大丈夫です👍

Auth::attemptで条件分岐

attemptメソッドは認証が成功したか否かでtruefalseを返します。

なので、これを元にフォームから送信されたデータでログインできるときとできないときで処理を分けることができます。

// 存在するユーザーのとき
$good_result = Auth::attepmt($existing_user);
echo $good_result; // trueが表示される

// 存在しないユーザーのとき
$bad_result = Auth::attepmt($unexisting_user);
echo $bad_result; // falseが表示される

// Auth::attemptの結果によって処理を分岐させることができる
if (Auth::attempt($user_info)) {
    // ログインが成功したとき
} else {
    // ログインが失敗したとき
}

セッションの再生成

ログインの操作自体はこれで完了なのですが、ログインの際に「セッション固定攻撃」を防ぐためにセッションを再生成しておきましょう。

// これでセッションを再生成(=regenerate)できる
$request->session()->regenerate();

これをログインが成功したときに挟んであげます。

LoginControllerを一部抜粋
// ログインに成功したとき
if (Auth::attempt($user_info)) {
    $request->session()->regenerate(); // 再生成を挟んであげる

    return redirect()->route('dashboard');
}
12
10
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
10