自分なりの目線で情報を発信します。
×
[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 | 2024/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)
カウンター
アク解アナライズ
ビジター