Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework Zend会话和Zend身份验证_Zend Framework_Zend Auth_Zend Session - Fatal编程技术网

Zend framework Zend会话和Zend身份验证

Zend framework Zend会话和Zend身份验证,zend-framework,zend-auth,zend-session,Zend Framework,Zend Auth,Zend Session,我已经通过zend auth建立了一个登录系统,下面是代码 // userAuthentication public function authAction(){ $request = $this->getRequest(); $registry = Zend_Registry::getInstance(); $auth = Zend_Auth::getInstance(); $DB = $regi

我已经通过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');
        }
  }
这项工作现在很好。用户(表)中有用户id(列),其中也有用户名和密码。我需要从这个表中获取特定的用户id,该表刚刚登录并将其放入会话中

$user_session = new Zend_Session_Namespace('user_session');
$user_session->username = $username;
$user_id->user_id       = $user_id;

这样我就可以根据这个$user\u id查询一些信息,并将结果传递到视图(名称)控制面板

从存储器获取用户id:

$userInfo = Zend_Auth::getInstance()->getStorage()->read();

echo $userInfo->user_id;

您可以按照Teez建议的方式访问数据,也可以从Zend_会话_名称空间中提取数据

15.1.3.1。PHP会话中的默认持久性
默认情况下,Zend_Auth提供来自成功会话的身份的持久性存储 尝试使用PHP会话进行身份验证。在成功的 身份验证尝试,Zend_Auth::authenticate()存储身份 从身份验证结果到持久性存储。除非 否则,Zend_Auth将使用名为 Zend_Auth_Storage_会话,它反过来使用Zend_会话。习俗 类可以通过提供实现 Zend_Auth_Storage_接口到Zend_Auth::setStorage()

Zend_Auth_Storage_会话使用“Zend_Auth”的会话命名空间。 可以通过将不同的值传递给 Zend_Auth_Storage_会话的构造函数,该值在内部 传递给Zend_会话_命名空间的构造函数。这应该 在尝试身份验证之前发生,因为 Zend_Auth::authenticate()执行 身份


虽然已经回答了这个问题,但我倾向于使用
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;

这是我的方法,效果很好: 1-i首先在引导中定义一个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 
 $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 ...

将阵列分配给会话时,必须为创建的会话区域提供名称,即在执行getStorage之前必须先执行设置存储

您必须这样编写代码:

   // 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里

享受吧

user=Zend_Auth::getInstance()->getIdentity(); 如果(!@$this->user){ $objSession->errorMsg=“请先登录…”; $this->_重定向('/user/login'); }
?>为什么要手动设置会话?登录后将创建会话,您可以从存储中获取该会话。@Teez如何从存储中获取用户id???$data=Zend\u Auth::getInstance()->getStorage()->read()$此->视图->用户名=$data->用户名$此->视图->id=$data->用户id;在进行此类查询之前,请记住清理/参数化用户电子邮件;)