在zf2上使用会话(恢复容器)

时间:2014-01-29 11:46:33

标签: session zend-framework2

先例:

  • 使用自定义hack OF ZfcUserLdap对LDAP服务器进行身份验证(也包括zfcUser作为依赖项)
  • hack是由于Ldap服务器使用ldapc包装器,因此绑定和搜索过程不属于Ldap标准,而是通过ldapc库
  • 登录/密码框通过修改bind和findbyuser方法
  • 对Ldap服务器起作用

需要:

  • 在登录步骤中添加国家/地区选择
  • 检查用户是否有权使用此国家/地区(因此,此处的国家/地区有意义,不需要ACL,将通过LDAP用户组进行检查)
  • 存储所选国家/地区以便在整个应用程序中使用

正在进行中:

  • 将可用国家/地区的SELECT下拉列表添加到登录框[确定]
  • 在登录表单中选择国家[确定]

    - >在ZfcUserLdap \ Authentication \ Adapter \ Ldap.php上的身份验证方法我正确地在表单中设置了国家/地区

问题:

  • 如何将国家/地区存储到会话变量中

    - >由于zfcUser已定义存储并且在登录步骤中定义了国家/地区,因此我想使用该存储

我将非常感谢您完成此任务的任何澄清或提示。

解:

zfcUserLdap模块的逻辑更多,因为auth是针对LDAP服务器的。 我在zfcUserLdap的扩展实体中添加了一个新属性 country ,它沿着 findByUsername 方法设置为Entity对象。

public function findByUsername($username, $country = null)
{
    $pUser = $this->ldap->findByUsername($username);

    if (isObjectNotNull($pUser))
    {
        $this->entity->setDisplayName(getLdapUserFirstName($pUser) . ' ' . getLdapUserLastName($pUser));
        $this->entity->setEmail(getLdapUserMail($pUser));
        $this->entity->setId(getLdapUserUid($pUser));
        $this->entity->setUsername(getLdapUserUid($pUser));
        $this->entity->setLdapcObject($pUser);
        $this->entity->setUserCountry($country);

        return $this->entity;
    }
    else {
        return null;
    }
}

要使此处的国家/地区有用,因为身份验证过程可能会检查用户名是否具有在该国家/地区内工作的权限。我稍后需要添加该检查。

像这样,国家是实体对象的一部分,所以我可以像获得用户名一样获得国家。

现在,我创建了一个非常类似于ZfcUserDisplayName的View Helper。我只是更新了获取metohd以获得国家财产。

 $countryName = $user->getUserCountry();

我计划创建一个Controller插件,以便从任何Controller获取国家/地区。

1 个答案:

答案 0 :(得分:1)

ZFCUser有一个您应该利用的身份验证事件。在你的模块的主要引导程序中:

$sm = $e->getApplication()->getServiceManager();
$zfcAuthEvents = $e->getApplication()->getServiceManager()->get('ZfcUser\Authentication\Adapter\AdapterChain')->getEventManager();

$zfcAuthEvents->attach( 'authenticate', function( $authEvent ) use( $sm ){
    try
    {
        // use $authEvent->getIdentity() to get country and stick it in a session

        return true;
    }
    catch( \Exception $x )
    {
        // handle it
    }
});

你在会话中的存储方式取决于你,有400种方法可以为那只猫提供皮肤。