PHPのログイン認証をPEAR::Authで実装する
PHPのシステムである程度ちゃんとしたログインシステムが必要になった。今までログイン周りはCOOKIEでやってきたけど、多分セキュリティとか危なそう。
かといってセッションはあまり使っていないので悩んでいたところ、pearのauthというのが良いと聞いた。実装時のメモ。
■事前準備
pearのAuthとDBというのが必要なのでSSHから以下コマンドで導入する。
1 2 |
pear install Auth pear install DB |
■ソース
・ログインページ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<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> |
・その他のページ(セッションを引き回すページ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?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エラーみたいなエラー表示が出ることがある。以下で非表示にする事は可能。
1 2 |
ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_STRICT); ini_set('display_errors',1); |
ログインページは参考ソースがたくさんあったので問題なかったけど、引き回したいページがあまり見つからず苦戦した。大抵のページは非ログインでも閲覧でき、例えばアカウント情報変更のようなログイン必須のページがあるような構成の場合は、checkUserLoginをClassのコンストラクタとかで実行しておいて、
・非ログインでも閲覧可→ソースのcheckUserLoginの関数で多分大丈夫。
・ログイン必須→予めログアウトページを作っておいてcheckUserLoginでfalseが返った場合はそちらに遷移させる
方法で一応動くことは動いた。
関連記事
-
-
Facebookのタイムラインを取得して表示する方法
Facebookのタイムラインを取得してきて、表示させたいという案件があった。 ...
-
-
PHPとajaxでチャットの作成
■ソース ・index.php <? error_reporting(E_ ...
-
-
CodeigniterでCSSやJSファイルを読み込む
CodeigniterでCSSやJSファイルを読み込みたかった。また、それをヘッ ...
-
-
preg_matchについて
PHPでのpreg_matchについて教わることがあったのでメモ。 ■参考サイト ...
-
-
PHPでif文とswitch文
ずっとif文を使っていたけどswitch文の方が速いみたい。 あとずらずら~とi ...
-
-
CRUDのfunction化(管理画面)
<? /* よく使うような管理画面(CRUD?)をfunctionで分けて ...
-
-
PHPでCSVを出力する際にメモリを節約
MySQLよりデータを大量に取り出してCSV化し、ダウンロードさせるというPHP ...
-
-
FLASHから受信した画像をPHPで保存し、サムネイルも作る
■参考サイト ・FLASH http://www.ilovex.co.jp/bl ...
-
-
PHPでのcookie
aaa.comにログインフォームがあって、IDパスを入れて ログインするとbbb ...
-
-
前置インクリメントと後置インクリメント
何かの検索している時に見つけたもの。 前置インクリメントの方が高速とのこと。 ■ ...