1

アプリケーションに 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');
}

すべてのモジュール/コントローラーでセッションを管理する簡単な方法はありますか?

4

2 に答える 2

1

異なるコントローラーに反復可能なロジックがある場合は、ロジック DRY を実装するコントローラー プラグインを検討してください。チェックが必要なすべてのコントローラーでこのプラグインを使用できます。

class MyController extends AbstractActionController
{
    public function indexAction()
    {
        if (!$this->ldapAuth()->isLoggedIn()) {
            // Do something
        }
    }
}

コントローラー プラグインは interfaceZend\Mvc\Controller\Plugin\PluginInterfaceを実装する必要がありますが、提供された abstract を使用する方が簡単です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',
    ),
),
于 2013-08-05T08:52:57.930 に答える
0

モジュールの onBootstrap() メソッドで DISPATCH イベントを処理してみてください。そこで、Service Locator を使用して、LDAP/セッション コンポーネントのインスタンスを作成し、ユーザーがログインしていることを確認する必要があります。ログインしていない場合は、アプリケーション フローを短絡して、ユーザーをログイン ページにリダイレクトできます。

于 2013-12-28T10:19:57.943 に答える