ketyiaの作ってみた

このサイトでは作ってみたことを記事にまとめていきます!

PHPで認証機能を作成してみる!③

こんにちは!IT勉強中のKeitaです!

この記事では、PHPで認証機能を作るということを記事にまとめています!
認証機能は、フレームワークを使うと簡単に実装できますが、処理の流れや原理を知っておこうということでPHPのみで作成しています!!

本記事では、これまでのデータを使いログアウトの機能を作成していこうと思います!

作成の流れは下記で行っていきます!

ログイン成功後画面の画面遷移を制限する
・ログアウト機能を追加する

ログイン成功後画面の画面遷移を制限する


以前の記事でログインの機能を作成しましたが、一点大きな落とし穴があります。
それが、URL直打ちで画面遷移ができてしまうことです。

ログインをせずに、下記のような動作が可能となってしまっています。


これは防がなくてはいけませんね!

処理としては、下記の要件を満たしていないユーザは画面遷移させないというようにします!
・データベースのテーブル(login_session)に認証の証(pass_key)を所持している

遷移後の画面を表示するPHPを下記のコードにします!

ーーーーーーーーーーーーーーーーー
【ok.php

<?php
session_start();

$id = '';
$error_message ='';

// セッションを受け取る
if(!empty($_SESSION['id'])){
    $id = $_SESSION['id'];
}

$db = new PDO('mysql:host=localhost;dbname=login','root','');

// SQL文実行
$sql = 'SELECT pass_key password FROM login_session WHERE login_users_id = :login_users_id;';

// 事前にSQL登録
$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

<?php
session_start();

$id = '';

if(!empty($_SESSION['id'])){
    $id = $_SESSION['id'];
}

$db = new PDO('mysql:host=localhost;dbname=login','root','');

try{
    $db->beginTransaction();
    // データを削除するSQLを設定する
    $sql = 'DELETE FROM login_session WHERE login_users_id = :login_users_id;';

    // データベースに事前にSQLを登録する
    $sth = $db->prepare($sql);

    // 変数名をバインド
    $sth->bindParam(':login_users_id', $id);

    // SQLを実行する
    $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