勉強したことのメモ

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

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

   2024/01/18  PHP

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

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

 

事前準備

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pear install Auth
pear install DB
pear install Auth pear install DB
pear install Auth
pear install DB

 

ソース

ログインページ

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<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>
<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>
<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>

 

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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();
}
}
?>
<?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(); } } ?>
<?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エラーみたいなエラー表示が出ることがある。以下で非表示にする事は可能。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_STRICT);
ini_set('display_errors',1);
ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_STRICT); ini_set('display_errors',1);
ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_STRICT);
ini_set('display_errors',1);

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

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

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

 - PHP

  関連記事

PHPで画像にモザイクをかけて保存

やりたかった事はPHPで ・モザイク処理 ・元の画像とは別にファイル名をつけて保 ...

PHPでtwitterとfacebookのいいねやフォローのカウント数を取得する方法

PHPでtwitterとfacebookのいいねやフォロー数を取得して表示させた ...

Opauthで「Please change the…」エラーの対応方法

Opauthを使用中に「Notice: Please change the va ...

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

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

AjaxのJSONP使用でPHPで作った配列をJSに返す方法

AというサイトからBというサイトにAjax通信し、Bの方ではMySQLに接続して ...

S