自分なりの目線で情報を発信します。			
		×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
						会社でZendFrameworkを使うことになった(なってしまった)ので、
Zend_Authを使ってログインページを作ってみました。
Zend_Auth(本家HP)
http://framework.zend.com/manual/ja/zend.auth.html
Zend_Authでは、ID・パスワードを保持する方法にいくつか種類があるそうなのですが、
普通にデータベースのテーブルに保持する方法を選択しました。
DBはMySQLで、ログイン情報を保持するテーブル定義は以下の通りです。
テーブル名
■ログインページ(login.php)
 
ログインIDとパスワードを入力して、認証用コントローラーにsubmitするだけです。
■認証用コントローラー(AuthController.php)
ログイン後のアクションを実行前には、常に認証済みであるかの確認を行いたいので、
 
 
																								Zend_Authを使ってログインページを作ってみました。
Zend_Auth(本家HP)
http://framework.zend.com/manual/ja/zend.auth.html
Zend_Authでは、ID・パスワードを保持する方法にいくつか種類があるそうなのですが、
普通にデータベースのテーブルに保持する方法を選択しました。
DBはMySQLで、ログイン情報を保持するテーブル定義は以下の通りです。
テーブル名
- admin
 
- loginid INT
 - password VARCHAR(16)
 - personname VARCHAR(32)
 
■ログインページ(login.php)
- 
<html>
 - 
<head>
 - 
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
 - 
<title>ログイン</title>
 - 
</head>
 - 
<body>
 - 
<h1>ログイン</h1>
 - 
<form action="/auth/login" method="post" name="loginForm">
 - 
<table summary="ログインフォーム">
 - 
<thead></thead><tfoot></tfoot>
 - 
<tbody>
 - 
<tr>
 - 
<th>ログインID</th>
 - 
<td>
 - 
<input type="text" name="loginid">
 - 
</td>
 - 
</tr>
 - 
<tr>
 - 
<th>パスワード</th>
 - 
<td>
 - 
<input type="password" name="password">
 - 
</td>
 - 
</tr>
 - 
</tbody>
 - 
</table>
 - 
<input type="submit" value="ログイン">
 - 
</form>
 - 
</body>
 - 
</html>
 
■認証用コントローラー(AuthController.php)
- 
<?php
 - 
 - 
class AuthController extends Zend_Controller_Action
 - 
{
 - 
const AUTH_TABLE_NAME = 'admin';
 - 
const AUTH_ID_NAME = 'loginid';
 - 
const AUTH_PASS_NAME = 'password';
 - 
 - 
 - 
// デフォルトアクション
 - 
public function indexAction()
 - 
{
 - 
// ログインページへ
 - 
return $this->_forward('login-page');
 - 
}
 - 
 - 
// ログインページ
 - 
public function loginPageAction()
 - 
{
 - 
$this->renderScript('login.php'); // ログインページのビュースクリプトを指定
 - 
}
 - 
 - 
// ログイン
 - 
public function loginAction()
 - 
{
 - 
'host' => 'localhost',
 - 
'username' => 'xxxx',
 - 
'password' => 'xxxx',
 - 
'dbname' => 'xxxx'
 - 
));
 - 
$authAdapter = new Zend_Auth_Adapter_DbTable(
 - 
$dbAdapter,
 - 
self::AUTH_TABLE_NAME,
 - 
self::AUTH_ID_NAME,
 - 
self::AUTH_PASS_NAME);
 - 
// リクエストパラメータ
 - 
$loginid = $this->getRequest()->getParam('loginid', '');
 - 
$password = $this->getRequest()->getParam('password', '');
 - 
if ($loginid === '' || $password === '') {
 - 
// そもそもIDまたはパスワードがない →認証NG →ログインページへ
 - 
return $this->_forward('login-page');
 - 
}
 - 
// IDとパスワードをセットする
 - 
$authAdapter->setIdentity($loginid);
 - 
$authAdapter->setCredential($password);
 - 
// 認証する
 - 
$result = $authAdapter->authenticate();
 - 
if ($result->isValid() === FALSE) {
 - 
// 認証NG →ログインページへ
 - 
return $this->_forward('login-page');
 - 
}
 - 
// 認証OK →認証済み情報をストレージ(セッション)に格納
 - 
$storage = Zend_Auth::getInstance()->getStorage();
 - 
$storage->write($resultRow);
 - 
// セッションID再生成
 - 
// ログイン後のデフォルトアクションへ
 - 
return $this->_forward('index', 'admin');
 - 
}
 - 
 - 
// ログアウト
 - 
public function logoutAction()
 - 
{
 - 
// 認証済み情報をストレージから削除
 - 
$authStorage = Zend_Auth::getInstance()->getStorage();
 - 
$authStorage->clear();
 - 
// ログインページへ
 - 
return $this->_forward('login-page');
 - 
}
 - 
 - 
}
 - 
 - 
// end of file
 
Zend_Auth_Adapter_DbTableに、データベースやテーブル情報を設定した上で、
リクエストで受け取ったIDとパスワードを認証します。
 
認証が無事終わったら、認証済み情報をストレージに格納しています。
このストレージというのは、PHPのセッションのことです。
 
明示的にストレージへの格納処理を書かなくとも、
Zend_Authは自動的にログイン時に入力されたIDをセッションに保存してくれるのですが、
ID以外の情報も参照したいため、今回は明示的に処理を記述しています。
 
少しはセキュリティを考慮したいので、セッションIDを再生成しています。
 
■ログイン後の各種アクション提供コントローラー(AdminController.php)- 
<?php
 - 
 - 
class AdminController extends Zend_Controller_Action
 - 
{
 - 
// 認証済み情報
 - 
 - 
// アクション前処理
 - 
public function preDispatch()
 - 
{
 - 
// 認証済み情報を取り出す
 - 
$authStorage = Zend_Auth::getInstance()->getStorage();
 - 
if ($authStorage->isEmpty()) {
 - 
// 認証済み情報がない →ログインページへ
 - 
return $this->_forward('login-page', 'auth');
 - 
}
 - 
}
 - 
 - 
// デフォルトアクション
 - 
public function indexAction()
 - 
{
 - 
// デフォルト処理いろいろ
 - 
}
 - 
 - 
// その他のアクション
 - 
public function otherAction()
 - 
{
 - 
// その他の処理いろいろ
 - 
}
 - 
 - 
// end of file
 
ログイン後のアクションを実行前には、常に認証済みであるかの確認を行いたいので、
preDispatchメソッドに認証済みの確認処理を記述しています。
 
認証用のコントローラーと、認証後のコントローラーを分けることで、
preDispatchに認証済みの確認処理が書きやすくしています。
 
※認証処理を行うコントローラーのpreDispatchに
認証済み確認処理を書いて、NGならログインページに飛ばすというような書き方をすると
 preDispatchで認証確認エラー
  →ログインページへ
   →ログインページの前処理であるpreDispatchで認証確認エラー
    →ログインページへ
     →ログインページの前処理であるpreDispatchで認証確認エラー
のような感じの無限ループになります・・・orz
これを避ける方法はいくらでもあると思いますが、少しはまったので。。。
うん、中々シンプルにログイン処理が作れたかなと思います。
PR
					
					お知らせ				
				
					最新記事				
				(03/11)
(02/23)
(01/08)
(12/28)
(11/18)
				
					カテゴリー				
				
					プロフィール				
				
HN:
	
shusatoo
性別:
	
男性
自己紹介:
	
				基本PHP。JavaScriptちょっとだけ。Javaをほんの少し。
					最新トラックバック				
				
					カレンダー				
				| 10 | 2025/11 | 12 | 
| S | M | T | W | T | F | S | 
|---|---|---|---|---|---|---|
| 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 | 
					ブログ内検索				
				
					最古記事				
				(09/18)
(09/23)
(10/01)
(10/09)
(10/10)
				
					カウンター				
				
					アク解アナライズ				
				
					ビジター