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でLINEログイン後「ユーザー名」「ユーザーID」「プロフィール画像URL」「メッセージ」を取得する方法
<a>タグのリンクからページ遷移するとLINEログインし、その後に「 ...
-
-
【2024年版】PHPMailerでGmailのSMTPサーバを経由してメールを送信する方法
だいぶ前に同じようなことをメモしたが、そちらの方法だと送信できずエラー内容を見た ...
-
-
エラー処理を1ページにまとめる
できるだけまとめておいた方が効率よさそうなのでメモ。 メインのフォルダにlogs ...
-
-
PHPとSQLiteでi-mobileのデータをグラフ化する方法
i-mobileでクリック保証のアフィリエイトだけど数値が並んでいるだけでグラフ ...
-
-
Composerで後から別のパッケージを追加する方法と削除する方法
Composerで何らかのパッケージをインストールし、後から別のパッケージを追加 ...