我通过zend auth创建了一个登录系统,这里是代码
// userAuthentication
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('user')
->setIdentityColumn('user_name')
->setCredentialColumn('user_password');
$username = $request->getParam('username');
$password = $request->getParam('password');
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);
$result = $auth->authenticate($authAdapter);
if($result->isValid()){
$data = $authAdapter->getResultRowObject(null,'password');
$auth->getStorage()->write($data);
$this->_redirect('/login/controlpannel');
}else{
$this->_redirect('/login/login');
}
}
这项工作现在很好。用户(表)中也有user_id(列),其中也有用户名和密码。我需要从这个表中获取特定的user_id,只需登录并通过
将其放入会话中$user_session = new Zend_Session_Namespace('user_session');
$user_session->username = $username;
$user_id->user_id = $user_id;
这样我就可以针对这个$ user_id查询一些信息并将结果传递给view(name)controlpanel
答案 0 :(得分:8)
从存储中获取用户ID:
$userInfo = Zend_Auth::getInstance()->getStorage()->read();
echo $userInfo->user_id;
答案 1 :(得分:8)
虽然已经回答了这个问题,但我倾向于比getIdentity()
链更频繁地使用getStorage()->read()
函数。以下示例。
// to check if authenticated
Zend_Auth::getInstance()->hasIdentity();
// to actually get the details from storage
Zend_Auth::getInstance()->getIdentity()->user_id;
// if I need to use the identity over and over
$identity = Zend_Auth::getInstance()->getIdentity();
$userId = $identity->user_id;
答案 2 :(得分:3)
您可以像Teez建议的那样访问数据,或者只是从Zend_Session_Namespace中提取数据。
<强> 15.1.3.1。 PHP会话中的默认持久性
默认情况下,Zend_Auth提供成功的标识的持久存储 使用PHP会话进行身份验证尝试。一旦成功 身份验证尝试,Zend_Auth :: authenticate()存储身份 从身份验证结果到持久存储。除非 除此之外,Zend_Auth使用名为的存储类 Zend_Auth_Storage_Session,它反过来使用Zend_Session。一个习俗 可以通过提供实现的对象来使用类 Zend_Auth_Storage_Interface to Zend_Auth :: setStorage()。Zend_Auth_Storage_Session使用'Zend_Auth'的会话命名空间。 可以通过向其传递不同的值来覆盖此命名空间 Zend_Auth_Storage_Session的构造函数,此值在内部 传递给Zend_Session_Namespace的构造函数。这应该 在尝试身份验证之前发生,因为 Zend_Auth :: authenticate()执行自动存储 身份。
答案 3 :(得分:2)
为会话分配数组,您必须为您创建的区域提供一个名称,即您必须在执行getStorage之前执行setStorage。
你必须像这样编写你的代码:
// userAuthentication
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('user')
->setIdentityColumn('user_name')
->setCredentialColumn('user_password');
$username = $request->getParam('username');
$password = $request->getParam('password');
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);
$authAdapter->setStorage(new Zend_Auth_Storage_Session('User_Auth'));
$result = $auth->authenticate($authAdapter);
if($result->isValid()){
$data = $authAdapter->getResultRowObject(null,'password');
$auth->getStorage()->write($data);
$this->_redirect('/login/controlpannel');
}else{
$this->_redirect('/login/login');
}
}
然后要获得存储值,您必须使用:
$x = new Zend_Auth_Storage_Session('User_Auth');
$y = $x->read();
你将$ y中的所有内容都作为对象。
享受!
答案 4 :(得分:1)
这是我的方法,它很好用: 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);
}
在正确的用户名和&amp;之后,在登录操作中/ * pwd * /
// Create session
$UserSession = Zend_Registry::get('UserSession');
// Get the user from database
$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 ...
答案 5 :(得分:0)