0

Zend_Session_NamespaceがZend_Authとどのように統合されているかを理解するのに苦労しています。ログインページを認証するためのアクションとして使用しているこのメソッドがあります。これは正しく機能しており、/monthlyビューにリダイレクトされます。

 public function authAction(){
    $request    = $this->getRequest();
    $registry   = Zend_Registry::getInstance();
    $auth       = Zend_Auth::getInstance(); 

    $DB = $registry['DB'];

    $authAdapter = new Zend_Auth_Adapter_DbTable($DB);
    $authAdapter->setTableName('users')
                ->setIdentityColumn('UserName')
                ->setCredentialColumn('Password');    

// Set the input credential values
    $uname = $request->getParam('UserName');
    $paswd = $request->getParam('Password');
    $authAdapter->setIdentity($uname);
    $authAdapter->setCredential($paswd);

   // Perform the authentication query, saving the result
    $result = $auth->authenticate($authAdapter);

       // TRYING TO SET THE NAMESPACE
        $this->session = new Zend_Session_Namspace('UserName');

    if($result->isValid()){
        $data = $authAdapter->getResultRowObject(null,'password');
        $auth->getStorage()->write($data);
        $this->_redirect('/monthly');

    }else{
        $this->_redirect('/login');
    }
}

ただし、UserNameをZend_sessionとして保存し、月次コントローラーから呼び出すことができる必要があります。これを実行しようとすると空白の画面が表示されるため、正しく実行していません。

public function indexAction()
{

$this->view->userName = Zend_Session_Namespace('UserName');
}
4

3 に答える 3

1

正しい名前空間を使用していません。Zend_Authは、Zend_Auth名前空間を使用します。名前空間は構造体であり、値のキーではありません。したがって、セッションは次のようになります。

Array('Zend_Auth' => array ('UserName' => 'myname')

アダプターに直接ユーザー名を指定しない限り、ユーザー名を保存していないため、正確ではありません。次のようなことをする必要があります:

$auth->getStorage()->UserName = 'myusername';

次に、でアクセスできます$authData = new Zend_Session_Namespace('Zend_Auth'); $username = $authData->UserName;

Zend_Auth_Adapter_Dbがどのように機能するかを詳しく見てみましょう。

于 2010-08-02T05:37:17.963 に答える
1

行で:

$data = $authAdapter->getResultRowObject(null,'password');
$auth->getStorage()->write($data);

パスワードを除いて、すべてのユーザー情報を書き込んでいます。これは問題ありません。ログインしたユーザーの詳細にアクセスする必要がある場合はいつでも、次のようなことができます(コメントに従って更新されます)。

public function indexAction() {
    $auth = Zend_Auth::getInstance();
    if($auth->hasIdentity()) {
        $userData = $auth->getIdentity();
        $this->view->user = $userData;
    }
}

ビューファイル(index.phtml)で:echo $this->user->firstname

それでおしまい。ある日、Zend_Authのストレージをセッションから、たとえばデータベースに変更することにした場合でも、このコードは機能します。

于 2010-08-02T15:43:12.833 に答える
0

これは私のアプローチであり、うまく機能しています:1-ブートストラップでinit関数を定義することから始めます

protected function _initSession()

{{

$UserSession = new Zend_Session_Namespace('UserSession');
$UserSession->setExpirationSeconds(/* you may fix a limit */);
Zend_Registry::set('UserSession', $UserSession);

}

/ *ログインアクションで、正しいユーザー名とパスワードの後* /

// Create session
$UserSession = Zend_Registry::get('UserSession'); 
// Get the user from database or just from fields
//you have to make sure that the psswd is encrypted use MD5 for example..
 $db = Zend_Db_Table::getDefaultAdapter();
$user = $db->fetchRow("SELECT * FROM user_table WHERE user_email = '".$user_email."'");
//then you assign to $user to $UserSession variable : 
$UserSession->user = $user;
//finaly don't forget to unset session variable in the Logout action ...
于 2013-06-05T14:35:13.360 に答える