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の関数呼べばすぐでしょう。

