5

我通过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 查询一些信息并将结果传递到视图(名称)控制面板

4

6 回答 6

8

从存储中获取用户 ID:

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

echo $userInfo->user_id;
于 2012-01-25T11:41:15.587 回答
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;
于 2012-05-09T18:41:42.770 回答
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::setStorage() 提供实现 Zend_Auth_Storage_Interface 的对象,可以改为使用自定义类。

Zend_Auth_Storage_Session 使用“Zend_Auth”的会话命名空间。这个命名空间可以通过传递一个不同的值给 Zend_Auth_Storage_Session 的构造函数来覆盖,并且这个值在内部传递给 Zend_Session_Namespace 的构造函数。这应该在尝试进行身份验证之前发生,因为 Zend_Auth::authenticate() 执行身份的自动存储。

于 2012-01-25T11:43:08.600 回答
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 中的所有内容都作为对象。

享受!

于 2013-07-31T10:32:38.747 回答
1

这是我的方法,效果很好: 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 ...
于 2013-06-05T11:06:54.347 回答
0
用户 = Zend_Auth::getInstance()->getIdentity(); if(!@$this->user){ $objSession->errorMsg = "请先登录.. !"; $this->_redirect('/user/login'); } ?>
于 2014-10-08T10:00:55.020 回答