Session 是否应该在ZF2中的每个控制器中实现会话包含和对象创建?

Session 是否应该在ZF2中的每个控制器中实现会话包含和对象创建?,session,authentication,ldap,zend-framework2,Session,Authentication,Ldap,Zend Framework2,我已经在我的应用程序中实现了LDAP身份验证,我想将用户名存储到会话中,并且必须检查所有的控制器/操作是否应该在LDAP用户登录时运行 为此,我是否应该在每个模块控制器中使用以下容器,并在ZF2中的每个模块/控制器中编写以下构造函数 use Zend\Session\Container; public function __construct() { $this->session = new Container('user'); // Check the user is

我已经在我的应用程序中实现了LDAP身份验证,我想将用户名存储到会话中,并且必须检查所有的控制器/操作是否应该在LDAP用户登录时运行

为此,我是否应该在每个模块控制器中使用以下容器,并在ZF2中的每个模块/控制器中编写以下构造函数

 use Zend\Session\Container;


public function __construct()
{
   $this->session = new Container('user');
    // Check the user is already logged in
    $sesUserNameExists = $this->session->offsetExists('username');
    $sesUserName = $this->session->offsetGet('username');
}

是否有任何简单的方法来管理所有模块/控制器中的会话?

如果在不同的控制器中有可重复的逻辑,请考虑一个控制器插件来实现该逻辑。您可以在需要检查的每个控制器中使用此插件:

class MyController extends AbstractActionController
{
    public function indexAction()
    {
        if (!$this->ldapAuth()->isLoggedIn()) {
            // Do something
        }
    }
}
控制器插件必须实现接口
Zend\Mvc\controller\plugin\PluginInterface
,但使用提供的抽象
AbstractPlugin

namespace MyModule\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;
use Zend\Session\Container;

class LdapAuth extends AbstractPlugin
{
    const SESSION_KEY = 'user';

    protected $session;

    public function __construct()
    {
        $this->session = new Container(self::SESSION_KEY);
    }

    public function isLoggedIn()
    {
        return isset($this->session->username);
    }

    public function getUsername()
    {
        return $this->session->username;
    }
}
此设置中的唯一技巧是您需要在服务管理器中注册插件。因此,使用
module.config.php
配置文件并添加以下行:

'controller_plugins' => array(
    'invokables' => array(
        'ldapAuth' => 'MyModule\Controller\Plugin\LdapAuth',
    ),
),

如果在不同的控制器中有可重复的逻辑,请考虑使用控制器插件来实现该逻辑。您可以在需要检查的每个控制器中使用此插件:

class MyController extends AbstractActionController
{
    public function indexAction()
    {
        if (!$this->ldapAuth()->isLoggedIn()) {
            // Do something
        }
    }
}
控制器插件必须实现接口
Zend\Mvc\controller\plugin\PluginInterface
,但使用提供的抽象
AbstractPlugin

namespace MyModule\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;
use Zend\Session\Container;

class LdapAuth extends AbstractPlugin
{
    const SESSION_KEY = 'user';

    protected $session;

    public function __construct()
    {
        $this->session = new Container(self::SESSION_KEY);
    }

    public function isLoggedIn()
    {
        return isset($this->session->username);
    }

    public function getUsername()
    {
        return $this->session->username;
    }
}
此设置中的唯一技巧是您需要在服务管理器中注册插件。因此,使用
module.config.php
配置文件并添加以下行:

'controller_plugins' => array(
    'invokables' => array(
        'ldapAuth' => 'MyModule\Controller\Plugin\LdapAuth',
    ),
),

尝试在模块的onBootstrap()方法中处理分派事件。在这里,您应该使用服务定位器创建LDAP/会话组件的实例,并验证用户是否已登录。如果没有,您可以短路应用程序流并将用户重定向到登录页面。

尝试在模块的onBootstrap()方法中处理分派事件。在这里,您应该使用服务定位器创建LDAP/会话组件的实例,并验证用户是否已登录。如果没有,您可以短路应用程序流并将用户重定向到登录页面