【问题标题】:How do I pass _SESSION('userName') from this Zend_Auth method to the layout?如何将此 Zend_Auth 方法中的 _SESSION('userName') 传递给布局?
【发布时间】:2010-08-02 05:26:50
【问题描述】:

我很难理解 Zend_Session_Namespace 是如何与 Zend_Auth 集成的。我使用此方法作为验证登录页面的操作 - 它工作正常并重定向到 /monthly 视图:

 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');
}

【问题讨论】:

    标签: zend-framework zend-session


    【解决方案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 的存储从会话更改为例​​如数据库,那么这段代码仍然可以工作。

    【讨论】:

    • 好吧该死-我对此没有任何运气。我在想我没有正确实例化每月控制器的 indexAction 中的东西(这是 authAction 重定向到的地方)。你愿意发布 indexActin 应该是什么样子吗?上面的代码是放在 indexAction 中还是 initAction 中?
    • 我已经更新了示例。您可以在(几乎)任何您想要的地方分配用户的信息。如果您只在一个操作中需要它,这就足够了。如果您在多个地方需要它,前端控制器插件或视图助手会更好。
    • 我似乎对此一点运气都没有。没有任何东西传递给视图。我也很困惑——“user->firstname”变量是从哪里来的? IE:是什么让 Zend_Auth 认为 userName 应该在 user->firstname 中找到?我不确定这是我的问题的一部分还是什么,但我只是没有弄清楚这一点。 :( 问题是否还在于 authAction 与monthlyAction 位于不同的控制器中?
    • indexAction 中,做一个var_dump($userData); 只是为了看看你在里面有什么。我将$this->user->firstname 仅作为示例。 users 表中的所有列(密码除外)都应位于 $userData 变量中。
    • 明白了!!!呜呼!就像我呼应“用户名”而不是“用户名”一样愚蠢。现在效果很好。谢谢!!
    【解决方案2】:

    您没有使用正确的命名空间。 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 是如何工作的。

    【讨论】:

    • 用户名是un the $uname,我可以这样做:'$this->session = new Zend_Session_Namspace($uname);' ?编辑:啊-我看到该变量只是未经身份验证的用户名。
    • 仔细看看你的例子——我明白了大部分。我不明白的是这一行: $authData = new Zend_Session_Namespace('Zend_Auth');我是否希望它仍然在 authAction 中,然后我是否还需要将它放在monthlyAction 中?我对如何将此会话变量从 Auth 控制器传递到 Monthly 控制器感到困惑。
    • 否...如果您使用的身份验证适配器是它使用的命名空间,则默认情况下它将由您的身份验证适配器创建。在索引操作中,您只需要使用new Zend_Session_Namespace('Zend_Auth') 重新水化命名空间,或者如果您以其他方式使身份验证或会话对象在全球范围内可用(例如通过注册表),您可以将其从那里拉出来。我忘记了它通常存储的数组键是什么。在 auth jsut 转储 $_SESSION 之后,你会看到......我不记得它是否存储为 identityuserid 或什么。
    【解决方案3】:

    这是我的方法,效果很好: 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);
    

    }

    /* 在登录操作中,在正确的用户名和密码之后 */

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多