PHPのログイン認証をPEAR::Authパッケージで実装する方法
2024/01/18
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のLocationにGETパラメータとして変数を入れる方法
PHPでページ遷移したい際に以下のように記述すると思う。 header("Loc ...
-
PHPでjpg / png画像をAVIF形式の画像に変換する方法
PHPでjpg / png画像をAVIF形式の画像に変換しサーバに保存したい。W ...
-
PHPで値が空の配列を削除
やりたかった事は配列でキーは入っていて値が入っていない ものを削除したかった。 ...
-
CodeIgniter3でCronを実行する方法
CodeIgniter3系で特定の処理をCronで自動実行したかった。以下に設定 ...
-
CodeIgniter4&Bootstrap&jQueryで簡易版お問い合わせページの作成
CodeIgniter4.4.4&Bootstrap&jQuer ...