インクルードするだけで使えるお手軽PHPフレームワーク「ちいたん」で メンバー制のページを構築する方法です。ログイン処理は、PEAR::Authなんかで 済ませるのが一般的ですが、せっかく世界最軽量のフレームワークを使うので、 ちいたんに用意されている仕組みを使って最小限のログイン処理を書いてみます
まず初めに、これから作るメンバー制ページの構成としては、
・index.php -> ログインフォーム・ログイン処理
・home.php -> ログイン後のメンバーページ
のように決めておきます。方針を少し説明しておくと、
ログイン処理は index.php 自体で行う。ログインフォームからのリクエストを 受信した場合、認証が成功すればメンバーページ(home.php)にリダイレクトする。
ログイン後のメンバーページ(home.php)では、毎回認証の確認を行う。 認証が失敗したりログアウトしたりすると、ログインページ(index.php)へリダイレクトする。
といった感じです。
ちいたんにはログイン処理用?に用意されている仕組みがあります。
「スクリプト中に is_secure 関数が定義してあり、しかもtrueを返す場合、 check_secure 関数を探して呼び出す」
というものです。
では早速、is_secure 関数をログインページの設定ファイル内に定義します。
ログイン処理の中身は check_secure 関数に定義します。
ここで、ログインフォームは、
では、認証が成功して メンバーページにリダイレクトしたとします。
メンバーページでは、毎回認証確認を行います。メンバーページの 設定ファイルに定義する is_secure 関数と check_secure 関数は 次のようになります。
・index.php -> ログインフォーム・ログイン処理
・home.php -> ログイン後のメンバーページ
のように決めておきます。方針を少し説明しておくと、
ログイン処理は index.php 自体で行う。ログインフォームからのリクエストを 受信した場合、認証が成功すればメンバーページ(home.php)にリダイレクトする。
ログイン後のメンバーページ(home.php)では、毎回認証の確認を行う。 認証が失敗したりログアウトしたりすると、ログインページ(index.php)へリダイレクトする。
といった感じです。
ちいたんにはログイン処理用?に用意されている仕組みがあります。
「スクリプト中に is_secure 関数が定義してあり、しかもtrueを返す場合、 check_secure 関数を探して呼び出す」
というものです。
//cheetan/dispatch.php
function _check_secure( $controller )
{
if( function_exists( "is_secure" ) )
{
if( is_secure( $controller ) )
{
if( function_exists( "check_secure" ) )
{
check_secure( $controller );
}
}
}
}
つまり、「is_secure 関数で認証が必要かどうかを判断し、
check_secure 関数で認証処理を実行する」という流れになります。では早速、is_secure 関数をログインページの設定ファイル内に定義します。
//config_index.php
function is_secure(&$c)
{
if(empty($_POST['mail'])) return false;
if(empty($_POST['pass'])) return false;
return true;
}
ここでは、メールアドレス (mail) とパスワード (pass) が POST リクエストで送られてきた場合にのみ
認証処理を行うようにします。それ以外の場合は、単にログインフォームを表示するだけになります。ログイン処理の中身は check_secure 関数に定義します。
//config_index.php
function check_secure(&$c)
{
$mail = $_POST['mail'];
$pass = $_POST['pass'];
$mail = $c->user->escape($mail);
$pass = $c->user->escape(md5($pass));
//check user
if($user = $c->user->findone("mail='$mail' and pass='$pass'"))
{
$_SESSION['user_id'] = $user['id'];
}
if(!empty($_SESSION['user_id']))
{
$c->redirect("http://****.com/home.php");
}
else
{
$c->set("msg","error!!!");
}
}
上のコードでは、受け取ったメールアドレスとパスワードから、
ユーザー用のテーブルを走査しています。そして、該当ユーザーが
見つかれば、セッションにユーザーIDをセットして、home.php に
リダイレクトします。もし、認証が失敗した場合は、「error!!!」
というメッセージをセットして、ログインページにエラーを表示する
ことにします。ここで、ログインフォームは、
<form method='post' action='index.php'> mail: <input type='text' name='mail'><br> pass: <input type='password' name='pass'><br> <input type='submit' name='login' value='LOGIN'> </form>ユーザー用のテーブル構成は例えば、
id int(11) unsigned not null auto_increment primary key, mail varchar(255) not null unique, pass varchar(32) not null, //md5で暗号化したパスワード nickname varchar(255)といった感じになります。
では、認証が成功して メンバーページにリダイレクトしたとします。
メンバーページでは、毎回認証確認を行います。メンバーページの 設定ファイルに定義する is_secure 関数と check_secure 関数は 次のようになります。
//config_home.php
function is_secure(&$c)
{
return true;
}
function check_secure(&$c)
{
if(!empty($_GET['act']))
{
if($_GET['act']=='logout') $_SESSION = array();//clear session
}
if(empty($_SESSION['user_id']))
{
$c->redirect("http://*****.com/index.php");
}
}
このようにしておけば、次のリンクでセッションがクリアされ
ログアウトできるようになります。
<a href='home.php?act=logout'>ログアウト</a>もちろん、ログイン処理を行ってない($_SESSION['user_id']がセットされていない) ユーザーはログインページへ強制的にリダイレクトされます。
2008年05月08日20時45分23秒
カテゴリ: ちいたん
カテゴリ: ちいたん