こんにちは!IT勉強中のKeitaです!
この記事では、PHPで認証機能を作るということを記事にまとめています!
認証機能は、フレームワークを使うと簡単に実装できますが、処理の流れや原理を知っておこうということでPHPのみで作成しています!!
本記事では、これまでのデータを使いログアウトの機能を作成していこうと思います!
作成の流れは下記で行っていきます!
・ログイン成功後画面の画面遷移を制限する
・ログアウト機能を追加する
ログイン成功後画面の画面遷移を制限する
以前の記事でログインの機能を作成しましたが、一点大きな落とし穴があります。
それが、URL直打ちで画面遷移ができてしまうことです。
ログインをせずに、下記のような動作が可能となってしまっています。
これは防がなくてはいけませんね!
処理としては、下記の要件を満たしていないユーザは画面遷移させないというようにします!
・データベースのテーブル(login_session)に認証の証(pass_key)を所持している
遷移後の画面を表示するPHPを下記のコードにします!
ーーーーーーーーーーーーーーーーー
【ok.php】
session_start();
$id = '';
$error_message ='';
// セッションを受け取る
if(!empty($_SESSION['id'])){
$id = $_SESSION['id'];
}
$sql = 'SELECT pass_key password FROM login_session WHERE login_users_id = :login_users_id;';
$sth = $db->prepare($sql);
// 変数名をバインド
$sth->bindParam(':login_users_id', $id);
// 実行
$sth->execute();
// 結果を取得する
$result = $sth->fetch();
// 結果は出ているか判定
if(!empty($result)){
$html = file_get_contents('ok.html');
print($html);
}else{
$error_message = 'ログインしてください';
$_SESSION['error_message'] = $error_message;
header('Location:login.php');
exit;
}
ーーーーーーーーーーーーーーーーー
はい。動作確認です!
これでURL直打ちの画面遷移を防ぐことができました。
ログアウト機能を追加する
さて次は、ログインしているユーザがログアウトする処理を追加していきます!
これは単純に、テーブル(login_session)内でログインしているユーザのデータを削除するという処理でいいかと思います!そうすることで、ログアウト後の画面にいることができなくなります!
ログイン後の画面からログアウトボタンを押下したときのPHP処理を書いていきます!
ーーーーーーーーーーーーーーーーー
【logout.php】
session_start();
$id = '';
if(!empty($_SESSION['id'])){
$id = $_SESSION['id'];
}
try{
$db->beginTransaction();
$sql = 'DELETE FROM login_session WHERE login_users_id = :login_users_id;';
$sth = $db->prepare($sql);
// 変数名をバインド
$sth->bindParam(':login_users_id', $id);
$sth->execute();
// コミット
$db->commit();
}catch (Exception $e) {
$db->rollback();
echo $e->getMessage();
}
// ここでセッションを消す
unset($_SESSION['id']);
// ログイン画面へ遷移
$error_message = 'ログアウトしました';
$_SESSION['error_message'] = $error_message;
header( 'Location: login.php' );
exit;
ーーーーーーーーーーーーーーーーー
これでOKです!
では、動作確認を行います!
ログアウト機能完成です!
これで一通りの認証機能は完成しました!!
これまでの説明で結構省いていた点等多々あって、わかりにくかった点もあるかと思うので、よかったらソースコードを参照してみてください!
それでは、ここまで読んでいただきありがとうございました。
前の記事はこちら
begginerkun.hatenablog.com