• []
  • []
  •  
  • del.icio.us 
  •  
  • Yahoo!֥åޡϿ 

PRADO ログインユーザー認証システム

PHP 求人 募集 Symfony CakePHP Smarty Ruby on Rails

PRADO ログインユーザー認証システム 概要

mixiやgree、はてななどを使っていて疑問に思ったことはないだろうか?
ID, Passなどを入力して進んだページと、
そうでないところでどうやってページを分けているのか?
これらはログイン認証というシステムを実装している。
会員サービスならば必ず必要になる。

ログインシステムは通常「セッション」を利用する。
(決してformタグにIDとパスワードが毎回埋め込まれているわけではない)
セッションとはCookieに特別なキーを格納し、
そのキーに対応するデータをサーバ側に保存する。
アクセスの度に対応するデータを呼び出すことによって、
単発のアクセスしかできないhttpで継続状態を維持する仕組みだ。
そのセッションに認証したかどうかのフラグを保存しておき、
ログイン状態かどうかを判別するのがログイン認証システム。
PHPにはセッション関数が存在しそれらを利用することで比較的簡単にログインシステムが作成できる。

データベースと絡めて複雑なシステムを組むことも出来る。
セキュリティを考えるとある程度複雑化はやむを得ない。、
それらは追々学んでいってもらうとして、
ここではPRADOで認証システムを実装するにはどうするかを触れるだけにしておく。

実装法は結構バリエーションに飛んでいる。
ユーザー単位、権利単位、ページ単位、ディレクトリ単位など細かく設定が出来るようになっている。
例えば、特定のID(guest, admin)などにアクセス公開・非公開にしたり、
ユーザーに権限フラグをつけて権限があるユーザーだけ通したり。
ページを全部一つのディレクトリに格納してページ単位で振り分けたり。
どれが一番にとかはなく、すべては用途に応じて使い分けることになる。
今回はとりあえず全ページログイン画面を出させるようにする。

PRADO ログインユーザー認証システム 実装

PRADO ログインユーザー認証設定

利用するのはデフォルトではTAuthManagerクラスとTUserManagerクラス。
データベースを利用する時はTUserManagerの代わりにTDbUserManagerクラス。
自前で作成する時はいずれかを継承したクラスを作成しそれを指定する。

モジュールにユーザー認証とアクセス制限を追加する /protected/application.xml

<services>
  <service id="page" class="TPageService" DefaultPage="Home">      
    <!-- modules configured and loaded when page service is requested -->
    <modules>
      <!-- user manager module -->
      <module id="users" class="System.Security.TUserManager"
 PasswordMode="Clear">
        <user name="demo" password="demo" />
      </module>
      <!-- auth manager module -->
      <module id="auth" class="System.Security.TAuthManager"
 UserManager="users" LoginPage="Login" />
    </modules>
  </service>  
</services>

pagesディレクトリにconfig.xmlを作成し、
アクセス制限を記述する。
/protected/pages/config.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <authorization>
    <deny users="?" />
  </authorization>
</configuration>

ユーザーの種類

記号詳細
*(アスタリスク)全ユーザー
@(アットマーク)登録ユーザー
?(クエスチョンマーク)ゲストユーザー

PRADO ログイン画面作成

あとはログイン画面を作りアクセスすれば
通常アクセスできていた場所にログイン画面が表示される。
/protected/pages/Login.php

<?php
 
class LoginUser extends TPage
{
  /**
   * Validates whether the username and password are correct.
   * This method responds to the TCustomValidator's OnServerValidate event.
   * @param mixed event sender
   * @param mixed event parameter
   */
  public function validateUser($sender,$param)
  {
    $authManager=$this->Application->getModule('auth');
    if(!$authManager->login($this->Username->Text,$this->Password->Text))
      $param->IsValid=false;  // tell the validator that validation fails
  }
 
  /**
   * Redirects the user's browser to appropriate URL if login succeeds.
   * This method responds to the login button's OnClick event.
   * @param mixed event sender
   * @param mixed event parameter
   */
  public function loginButtonClicked($sender,$param)
  {
    if($this->Page->IsValid)  // all validations succeed
    {
      // obtain the URL of the privileged page that the user wanted to visit originally
      $url=$this->Application->getModule('auth')->ReturnUrl;
      if(empty($url))  // the user accesses the login page directly
          $url=$this->Service->DefaultPageUrl;
      $this->Response->redirect($url);
    }
  }
}

/protected/pages/Login.page

<com:TContent ID="Main">
 
<h1>Login</h1>
 
<span>Username:</span>
<com:TRequiredFieldValidator
    ControlToValidate="Username"
    ErrorMessage="Please provide your username."
    Display="Dynamic" />
<br/>
<com:TTextBox ID="Username" />
 
<br/>
<span>Password:</span>
<com:TCustomValidator
    ControlToValidate="Password"
    ErrorMessage="Your entered an invalid password."
    Display="Dynamic"
    OnServerValidate="validateUser" />
<br/>
<com:TTextBox ID="Password" TextMode="Password" />
 
<br/>
<com:TButton Text="Login" OnClick="loginButtonClicked" />
 
</com:TContent>

PRADO ログインユーザー認証システム 補足

一般的にログインシステムはPOSTリクエストを受け付けて認証するものだが、
例外的にGETリクエストを受け付けて認証させたい時もあるだろう。
通常では別認証として認証システムをもう一つ組むところだが、
PRADOのイベントドリブンをうまく使うとあっさりできたりする。

このサンプルではonClick実行時に動作するようにしているが、
これをonLoad時に動作するようにすると、
ログインページをロードした時に認証させることが出来る。
ログイン画面をエラーメッセージにしておき、
onLoad時に認証させる仕組みにしておけば、
GETリクエストの認証システムを組むことが出来る。


framework/prado/authentication.txt · 最終更新: 2007/07/26 16:12 by dozo