Zend会话和zend auth

时间:2012-01-25 11:21:15

标签: zend-framework zend-auth zend-session

我通过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

6 个答案:

答案 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)

user = Zend_Auth :: getInstance() - &gt; getIdentity();         如果(@ $这个 - &GT;!用户){             $ objSession-&gt; errorMsg =&#34;请先登录 .. ! &#34 ;;             $这 - &GT; _redirect(&#39; /用户/登录&#39);         } ?&GT;