勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPのログイン認証をPEAR::Authパッケージで実装する方法

   2024/01/18  PHP

PHPのシステムである程度ちゃんとしたログインシステムが必要になった。今までログイン周りはCOOKIEでやってきたけど、多分セキュリティとか危なそう。

かといってセッションはあまり使っていないので悩んでいたところ、PEARのAuthパッケージというのが良いと聞いた。実装時のメモ。

 

事前準備

pearのAuthとDBというのが必要なのでSSHから以下コマンドで導入する。

pear install Auth
pear install DB

 

ソース

ログインページ

<html>
<head>
<title>login</title>
</head>
<body>
<?php
include_once "Auth/Auth.php";
include_once 'DB.php';
function loginFunction($username, $status){
    echo '
        <form method="post" action="'.$_SERVER['PHP_SELF'].'">
            <input type="text" name="username" placeholder="username"><br>
            <input type="text" name="password" placeholder="password"><br>
            <input type="submit">
        </form>
    ';
}
$params = array(
    "dsn" => "mysqli://{$database_user}:{$database_pass}@{$database_host}/{$database_name}", //MySQLのアカウント情報を入れる
    "table" => $database_table, //認証に使うテーブルを指定
    "usernamecol" => "username", //idやmailadress等を使いたい場合はここの値を変える
    "passwordcol" => "password",
    'db_fields' => "*" //これを指定しておくと該当ユーザーの他の絡む情報も取得できる
);
$login = new Auth("DB", $params, "loginFunction");
$login->start();

if ( $login->getAuth() ){
    //ログイン成功時の処理
}
?>
</body>
</html>

 

その他のページ(セッションを引き回すページ)

<?php
include_once "Auth/Auth.php";
include_once 'DB.php';

function checkUserLogin(){

    if( !$_COOKIE['PHPSESSID'] || !$_COOKIE['authchallenge'] ){ //COOKIEに残ってない場合はログアウトしているものとみなす
        return false;
    }

    $auth = new Auth('DB');
    $auth->start();
    if ($auth->getAuth()){
        $user = array( //getAuthData($key)の$keyはデータベースのカラム名
            'id' => $auth->getAuthData("id"), 
            'mail' => $auth->getAuthData("mail"), 
            'date' => $auth->getAuthData("date")
        );
    }else{ //COOKIEに残っていてログインできない場合はセッション削除してログインページにとばす
        $_SESSION = array();
        setcookie("PHPSESSID", '', time() - 1800, '/');
        setcookie("authchallenge", '', time() - 1800, '/');
        session_destroy();
        header('Location:login.php');
        exit();
    }

}
?>

 

その他

pearを使っていると動くことは動くけどSTRICTエラーみたいなエラー表示が出ることがある。以下で非表示にする事は可能。

ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_STRICT);
ini_set('display_errors',1);

ログインページは参考ソースがたくさんあったので問題なかったけど、引き回したいページがあまり見つからず苦戦した。大抵のページは非ログインでも閲覧でき、例えばアカウント情報変更のようなログイン必須のページがあるような構成の場合は、checkUserLoginをClassのコンストラクタとかで実行しておいて、

  • 非ログインでも閲覧可→ソースのcheckUserLoginの関数で多分大丈夫。
  • ログイン必須→予めログアウトページを作っておいてcheckUserLoginでfalseが返った場合はそちらに遷移させる

方法で一応動くことは動いた。

 - PHP

  関連記事

PHPからDBX Platformを利用してDropbox内にディレクトリ(フォルダ)を作成する方法
PHPからDBX Platformを利用してDropbox内にディレクトリ(フォルダ)を作成する方法

PHPからDBX Platformを利用してDropbox内にディレクトリ(フォ ...

Composer無し&ファイル1枚でPHPのエラーメッセージ画面をリッチにするライブラリ「PHP Error」の利用方法
Composer無し&ファイル1枚でPHPのエラーメッセージ画面をリッチにするライブラリ「PHP Error」の利用方法

先日PHPのエラーメッセージを見やすくするwhoopsの利用方法をメモしたが導入 ...

PukiWikiでバックアップを週一等スケジュール化して実行する方法
PukiWikiでバックアップを週一等スケジュール化して実行する方法

PukiWikiでバックアップを取りたかった。調べたらディレクトリごと保存すれば ...

LeagueCSVで「The header record must be empty~~」エラーが発生する原因と対応方法
LeagueCSVで「The header record must be empty~~」エラーが発生する原因と対応方法

以前にメモしたPHPのLeagueCSV(thephpleague / csv) ...

PHPで配列のキーの最大値を取得する方法
PHPで配列のキーの最大値を取得する方法

配列のキーに整数値が入っていて、その中から最大値を取得したいケースがあった。調べ ...