ラボ > Laravel、Lumen:ユーザー認証関連
Laravel 既存テーブルで認証(Auth、ログイン機能)を作る
ユーザーテーブルが別途指定されていたり、諸々の事情である程度、自前でログイン機能を作る必要があるとき。
作成日:2019-10-03, 更新日:2022-12-22
基本
個人的にLaravelは嫌い。
コンソールで「artisan」のコマンドを叩いて、コトあるごとに「composer」のコマンドを叩く必要があるため。
特に「artisan」のコマンドを叩くとドコに何のファイルが増えて、どのファイルが書き換えられて・・・ってのが分からない。
時間をかけて調べれば分かるんだろうけど、そこまで時間をかけるコトができない。
▼対象者
・ひとまずログイン機能を実装しなくちゃいけない
・ログイン機能でカスタマイズが必要(or 超シンプルにしたい、余計なコトはしないで欲しい)
※「artisan」のコマンドを叩いた結果を元にカスタマイズが可能な人は対象外。
▼触るとこ
・\App\User.php
・コントローラーとか
\App\User.php
// テーブル名 protected $table = '〇〇〇〇'; // プライマリーキー(指定なしだと「id」) protected $primaryKey = '〇〇〇〇'; // デフォルトでは自動インクリメントが true public $incrementing = false; // テーブルに組み込むカラム名たち protected $fillable = [ '〇〇〇〇', 'password', 'remember_token', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', ]; // パスワードのカラム名 public function getAuthPassword() { return $this->password; }
こんな感じ。
テーブルには「created_at」「updated_at」が必須っぽい。
コントローラーとか
・「use」は出来る限り使わないようにする方針(※ソースを追いかけやすくするため)
ユーザー作成:パスワードは手動でハッシュ化
$userData = array( 'member_id' => '123458', 'password' => bcrypt('abcd'), 'password_date' => date('Y-m-d H:i:s'), ); $result = \App\User::create($userData);
ユーザーログイン
$username = '123458'; $password = 'abcd'; $remember = true; // クッキーを使用して、ログインし続ける $result = \Auth::attempt(['member_id'=>$username, 'password'=>$password], $remember);
※$resultは「true / false」
ログアウト
\Auth::logout();
ログインチェック
if ( \Auth::check() ) { if (\Auth::viaRemember()) { echo '「remember me」クッキーを使用して認証中'; } else { echo '「remember me」クッキーを使用せずに認証中'; } } else { echo 'ログアウト中'; }
ユーザー情報取得
$result = \Auth::user();
※ログインしていない場合は$resultには「NULL」
パスワードが等しいかチェック
$pwd_Hash = DBに保存しているハッシュ化されたパスワード $pwd_input = 平文のパスワード if ( \Hash::check($pwd_input, $pwd_Hash) ) { echo '正しいパスワードです'; } else { echo '間違ったパスワードです'; }
メモ
呼び出されている大元たち
・vendor\laravel\framework\src\Illuminate\Auth
・vendor\laravel\framework\src\Illuminate\Foundation\Auth
artisanで作られるファイル?
色々と調べていたら・・・下記のようなファイルが作られるっぽい。
ログイン回りの処理があるのでコレを参考にすればよさげ。
<?php namespace App\Http\Controllers\Auth; use App\User; use Carbon\Carbon; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; class AuthController extends Controller { public function login(Request $request) { $request->validate([ 'email' => 'required|string|email', 'password' => 'required|string', //'remember_me' => 'boolean' ]); $credentials = request(['email', 'password']); if(!Auth::attempt($credentials)) return response()->json([ 'message' => 'Unauthorized' ], 401); $user = $request->user(); $tokenResult = $user->createToken('Personal Access Token'); $token = $tokenResult->token; if ($request->remember_me) $token->expires_at = Carbon::now()->addWeeks(1); $token->save(); return response()->json([ 'access_token' => $tokenResult->accessToken, 'token_type' => 'Bearer', 'expires_at' => Carbon::parse( $tokenResult->token->expires_at )->toDateTimeString() ]); } public function register(Request $request) { $request->validate([ 'fName' => 'required|string', 'lName' => 'required|string', 'email' => 'required|string|email|unique:users', 'password' => 'required|string' ]); $user = new User; $user->first_name = $request->fName; $user->last_name = $request->lName; $user->email = $request->email; $user->password = bcrypt($request->password); $user->save(); return response()->json([ 'message' => 'Successfully created user!' ], 201); } public function logout(Request $request) { $request->user()->token()->revoke(); return response()->json([ 'message' => 'Successfully logged out' ]); } /** * Get the authenticated User * * @return [json] user object */ public function user(Request $request) { return response()->json($request->user()); } }