イントロ
こちらはLaravelドキュメントの認証のページを分かりやすくかみ砕いたものになります!
タイトルにある通り、今回はパッケージを使わずにLaravelでのユーザーを手動で認証する(=ログインさせる)機能を解説したいと思います!
今回解説するLaravelドキュメントはバージョン8.xです
認証と同じ意味やで
Web業界ではログインのことを「認証」や、英語で「authentication」などと言ったりします。
なのでこの先に、ログインと言わずに認証と言ったりすることがあるかも知れませんが、概ねログインのことを指していると思ってもらってOKです。
attempt
メソッドを使う
Laravelで認証周りのサービスはAuth
ファサードを介することで実装できます。
Auth
ファサードのattempt
メソッドを用いることで、ユーザーのログイン処理をすることができます。
まずは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
メソッドは認証が成功したか否かでtrue
かfalse
を返します。
なので、これを元にフォームから送信されたデータでログインできるときとできないときで処理を分けることができます。
// 存在するユーザーのとき
$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();
これをログインが成功したときに挟んであげます。
// ログインに成功したとき
if (Auth::attempt($user_info)) {
$request->session()->regenerate(); // 再生成を挟んであげる
return redirect()->route('dashboard');
}