前回のエントリで書いた内容は全然よろしく無かったです。
[wiki]** Ethna_ActionClassにauthenticateメソッドがありました。[/wiki]
順番としては、authenticate > prepare > performって処理してくれるので、authenticateを作ったActionClassを作っておいて、認証が必要なActionClassはそのクラスを継承させることにします。
なので、app/action/Login/Auth.phpでPEAR::Authを使ったauthenticate処理を
<?
function authenticate()
{
if( ! $this->session->isStart() ){
$this->session->start(0) ; }
$mailaddress = ! is_null($this->af->get('mailaddress')) ?
$this->af->get('mailaddress') : '' ;
$password = ! is_null($this->af->get('password')) ?
$this->af->get('password') : '' ;
$Config =& $this->backend->getConfig() ;
$params = $Config->get('auth_params') ;
require_once 'Auth/Auth.php' ;
$loginauth =& new Auth("MDB", $params, '', false );
$loginauth->setExpire(2400, true) ;
if( ! $loginauth->checkAuth() ){
$_POST['username']=(!empty($mailaddress))?$mailaddress:'' ;
$_POST['password']=(!empty($password)) ? $password : '' ;
$loginauth->start() ;
if( $loginauth->checkAuth() ){
return null ;
}
}else{
return null ;
}
return 'login';
}
?>
とかしておいて、認証アクションでは
<?
require_once "action/Login/Auth.php" ;
class Kcaffiliate_Action_LoginMenu extends Kcaffiliate_Action_LoginAuth
?>
としてやればオッケーです。
ハマったが、セッションの扱い。Ethna_Sessionというセッションのラッパークラスがバックエンドが動いているように見えるけど、Ethna_Session::start()をさせないとあくまでバーチャル的に動作するみたいだ。保存されずに、1リクエスト毎のセッション(それってセッションじゃないじゃん)となって結構「??」となった。勝手にセッションをスタートさせてるのかなーとか思ってた(そんなダサイ仕様にするわけがないんだけどさ。よく考えなくても)ので、ハマりました。