0

ユーザーがZend_Auth_Adapter_Ldapを使用して認証され、セッションに保存されるZend_AclおよびZend_Authスキームを設定しました。コントローラプラグインを使用して、ログインフォームを確認し、必要に応じて表示します$auth->hasIdentity()$acl->isAllowed()

私がやりたいのは、Zend_Authのセッションチェックに加えて、ログインCookie(ベストプラクティスの実装)とAPIキーを追加することです。また、ユーザーが作成したコンテンツで、役割を「所有者」に切り替える必要があります。

私の懸念:

  • ログインCookieは、通常のセッション認証が失敗した場合のフォールバックとしてのみ使用する必要があるため、セッションを認証する必要があります
  • ログインCookieとセッションCookieの両方が失敗した場合のフォールバックとしてAPIキーを使用する必要があります
  • パスワードをどこにも保存したくないので、LDAPにのみ存在する必要があります
  • 完全なユーザー名とパスワードがないとLDAPで検索できないため、IDを永続的に保存する必要があります
  • この役割は、LDAPグループメンバーシップ(永続的に保存する必要がある)と、IDをコンテンツの所有者と見なす必要があるかどうか(管理者でない限り、要求間で変更されることを意味します)の両方に依存します。

ZendFrameworkMVCとZend_Auth+Zend_Aclを使用してこれを解決するための良いパターン/アプローチは何ですか?

4

1 に答える 1

0

Zend_Auth_Adpater_Interface と Zend_Auth_Storage_Interface を実装して、独自のアダプター/ストレージ クラスを作成できます。

これらのクラスでは、元のアダプター (LDAP など) またはストレージを再利用でき、認証ルールを実装するコードのみを記述できます。

たとえば、 Zend_Auth_Adapter に複数のソースを使用します。

<?php 
class My_Auth_Adapter implements Zend_Auth_Adapter_Interface
{
    private $ldapAdapter;
    private $cookieAdapter;
    private $apiKeyAdapter;

    public function __construct($ldapAdapter, $cookieAdapter, $apiKeyAdapter) {
    {
        $this->ldapAdapter = $ldapAdapter;
        $this->cookieAdapter = $cookieAdapter;
        $this->apyKeyAdapter = $apiKeyAdapter;
    }
    public function authenticate()
    {
         if ($this->ldapAdapter->authenticate()) {
             //return the Zend_Auth_Restult
         } elseif ($this->cookieAdapter->authenticate() {
            //return the result
         } elseif ($this->apiKeyAdapter->authenticate() {
           //return the result
         } else {
           //Create and return a Zend_Auth_Result which prevents logging in
          }
     }
}

あなたのログイン ルールを理解することはできませんが、ストレージ クラスの概念は同じです。

 <?php 
 class My_Auth_Storage implements Zend_Auth_Storage_Interface
  private $sessionStorage;
  private $cookieStorage;
  private $apiStorage;

  public function read()
  {
      if (!$this->sessionStorage->isEmpty())
      {
           return $this->sessionStorage->read();
      } elseif (!$this->cookieStorage->isEmpty())
      { 
           return $this->cookieStorage->read();
      } //And so one, do not forget to implement all the interface's methods

この実装により、複数の資格情報ソースと複数のセッション ストレージ エンジン (Cookie、セッション、DB、または使用したいもの) を持つことができます。

acl の問題については、コントローラー プラグインで LDAP グループを取得し、認証後に必要な場所に保存できます。次に、リクエストごとに ACL をチェックする 2 つ目のプラグインを使用できます。

于 2011-09-11T09:30:08.337 に答える