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が返った場合はそちらに遷移させる
方法で一応動くことは動いた。
関連記事
-
-
Cookieをできるだけ長い期間保存する方法
あるシステムの中でCookieを可能な限り長い期間保存したいというリクエストを受 ...
-
-
PHPで日付の比較
以前に「締切日を設けて、今日の日付と比較して分岐させる」というもので 日付の比較 ...
-
-
SendGridを使ってメールサーバを構築せずにPHPからメールを送信する方法
メールサーバを構築せずに独自ドメインのメールアドレスにてメール送信を行いたい。過 ...
-
-
PHPで簡単にカレンダーを生成できるライブラリ「PHP Calendar」の利用方法
PHPでカレンダーを描写したいということがたまにある。今までバニラPHPで書いて ...
-
-
数値を3桁とかでカンマ区切りにする
見たこと無い関数が業務中にあったのでメモ。 number_format ■参考サ ...