(PHP)セッションと認証の仕掛け
PHPでログイン画面を使って、ログインし後はセッションを使って認証状態を確認するような、いわゆる普通の会員向けのページを作ってます。
で、久しぶりのPHPでだいぶセッションやら認証やら忘れてました。
とりあえず、テンプレートエンジン Smarty を使ってこんな感じで作ってみました。
POSTが無ければ初回ログインとみなしログインページを表示、認証失敗ならその旨をログインページに表示、認証成功ならセッション変数にユーザ名を格納し会員ページへ遷移といった感じです。
会員ページでは、セッション変数のユーザ名がいるかどうか確認しなければ不正アクセスとしてログインページへ遷移させるという仕組みです。
○index.php
require_once 'util.php' ;
//初期処理
Init();
//ユーザ情報
$username = "user";
$passwd = "41d3f22b449c345290adaa3ad7380d3c6";//パスワードのハッシュ
//メッセージ
$txtMsg ="";
if ( ! array_key_exists('userid', $_POST) && ! array_key_exists('passwd', $_POST) ){
//入力データが無いなら初回ログインとみなし、何も表示しない
$txtMsg ="";
}else if( $username == $_POST['userid'] && $passwd == md5( $_POST['passwd']) )
{
//認証成功
//セッション開始
//セッションID振り直し
//session_regenerate_id(true);
//セッションにユーザ名入れる。(他のページではusernameセッション変数があれば認証OKとする)
$_SESSION["username"] = $username;
//会員ページへ遷移
exit;
}else{
//認証失敗時のメッセージ
$txtMsg =" 入力したログイン情報に誤りがあります。正しい値を入力してください。
";}
//Smarty読み込み(ドキュメントルート外のSmartyクラスにアクセス)
require_once('../smarty/libs/Smarty.class.php');
//Smartyオブジェクト作成
//Smartyのディレクトリ設定(キャッシュやテンプレート置き場など)
$smarty->template_dir = "../smarty/templates";
$smarty->compile_dir = "../smarty/templates_c";
$smarty->cache_dir ="../smarty/cache";
//表示データをアサイン
$smarty->assign("txtMsg", $txtMsg);
//テンプレート表示
$smarty->display("index.tpl");
?>
○index.tpl
http-equiv="Content-Type" content="text/html; charset=UTF-8">
{* ログインメッセージ *}
{$txtMsg}
method="post" action="index.php" id="login">
ユーザ名: type="text" style="ime-mode: disabled" maxlength="10" name="userid" id="userid">
パスワード: type="password" style="ime-mode: disabled" maxlength="10" name="passwd" id="passwd">
type="submit" value="ログイン" class="submitstyle" name="Submit">
○util.php
/**
* 初期化処理。
* 文字コードの設定。
* 各ページの最初に呼ぶこと。
*/
function Init(){
header("Content-type: text/html; charset=UTF-8");
mb_language("Japanese");
mb_internal_encoding("UTF-8");
}
/**
* ログインしているかのチェックを行う。
* セッションも開始する。
* ログインしていなければログインページに飛ばす。
*/
function LoginCheck(){
//認証できてなければログインページへ
if ( ! isset( $_SESSION["username"] ) ){
header("Location:index.php");
exit;
}
}
?>
○認証が必要なページ(認証失敗ならログイン画面に遷移)
require_once 'util.php';
//初期処理
Init();
//ログインチェック
LoginCheck();
//処理。。。。。
?>