我已在我的应用程序中实现了LDAP身份验证,并且我想将用户名存储到会话中,并且必须检查在LDAP用户登录时应运行的所有Controller / Action。
为此,我是否应该在每个模块控制器中使用以下Container,我应该在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');
}
有没有简单的方法来管理所有模块/控制器中的会话?
答案 0 :(得分:1)
如果您在不同的控制器中具有可重复的逻辑,请考虑使用控制器插件来实现逻辑DRY。您可以在需要检查的每个控制器中使用此插件:
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',
),
),
答案 1 :(得分:0)
尝试在模块的onBootstrap()方法中处理DISPATCH事件。在那里,使用服务定位器,您应该创建LDAP /会话组件的实例并验证用户是否已登录。如果没有,您可以短路应用程序流并将用户重定向到登录页面。