我很难理解Zend_Session_Namespace如何与Zend_Auth集成。我使用这种方法作为验证登录页面的操作 - 它正常工作并重定向到/月视图:
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');
}
答案 0 :(得分: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的工作原理。
答案 1 :(得分: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的存储从会话更改为例如数据库,那么这段代码仍然有效。
答案 2 :(得分:0)
这是我的方法,它很好用: 1-i首先在bootstrap中定义一个init函数
protected function _initSession()
{
$UserSession = new Zend_Session_Namespace('UserSession');
$UserSession->setExpirationSeconds(/* you may fix a limit */);
Zend_Registry::set('UserSession', $UserSession);
}
在正确的用户名和&之后,在登录操作中/ * pwd * /
// 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 ...