« カスタムバリデータでログインチェックを行う(p) | メイン(m) | 四季食彩 萩のへしこ寿司をいただく »(n)

ログイン処理をさらにリファクタリングする

ID/PWのチェックがカスタムバリデータに移ったのは良いのですが、本来検証だけをおこなうバリデータなのに認証チケットを渡したり、権限を設定したりする処理が記述されているというのもちょっと気持ち悪い感じです。

これらの処理はカスタムバリデータの外に追い出したいので、デフォルトで用意されているmyUser.class.phpに書くことにします。

apps/admin/lib/myUser.class.php

<?php
 
class myUser extends sfBasicSecurityUser
{
  public function logIn($user)
  {
    $this->setAuthenticated(true);
    $this->addCredential($user->getPermissionName());
    $this->setAttribute('user_name', $user->getUserName());
    $user->setLastLogin('NOW');
    $user->save();
  }
 
  public function logOut()
  {
    $this->setAuthenticated(false);
    $this->clearCredentials();
  }
}

apps/admin/lib/myLoginValidator.class.php

<?php
 
class myLoginValidator extends sfValidator
{
  public function initialize($context, $parameters = null)
  {
    // initialize parent class
    parent::initialize($context);
 
    // set defaults
    $this->setParameter('login_error', 'invalid login');
    $this->getParameterHolder()->add($parameters);
 
    return true;
  }
 
  public function execute(&$value, &$error)
  {
    $password = $this->getContext()->getRequest()->getParameter('password');
 
    $c = new Criteria();
    $c->add(UserPeer::USER_NAME, $value);
    $user = UserPeer::doSelectOne($c);
 
    if ($user)
    {
      if ($password == $user->getPassword())
      {
        // login success
        $this->getContext()->getUser()->logIn($user);
        return true;
      }
    }
 
    $error = $this->getParameter('login_error');
    return false;
  }
}

さらにuser/logoutアクションも、変更します。

apps/admin/modules/user/actions/actions.class.php

  public function executeLogout()
  {
    $this->getUser()->logOut();
    return $this->redirect('menu/index');
  }

これでログインまわりの処理は文句無い実装になってきました。

本当はパスワードは暗号化して保存したりした方がいいんだけど、そこらへんの処理は省略。
PHPの関数呼べばすぐでしょう。



« カスタムバリデータでログインチェックを行う | メイン | 四季食彩 萩のへしこ寿司をいただく »

Trackbacks

このエントリーのトラックバックURL:

Post a commnet

AMN sponsor rolls


著書

実践Web2.0 BOOK 人気ブロガー直伝! 一歩先行くWeb2.0的ワーキングスタイル
ムーバブル・タイププラグインディレクトリ―PROFESSIONAL NETWORK