1

認証されたユーザーが、ユーザーの種類ではなく、特定のコントローラー/アクションへのアクセスを許可されるソリューションが必要です。管理者または通常のユーザー (後で標準の ACL を使用してこれを追加する可能性がありますが) が、ユーザーの現在のステータスに応じて異なります。

例えば ​​:

彼らは 1 週間以上サイトのメンバーでしたか?

彼らは自分のプロフィールを完全に記入しましたか?

実際、今考えてみると、彼らがこのサイトに特権とバッジを持っているようなものです。

4

1 に答える 1

1

説明しているような動的条件ベースのテストでは、ルールで動的アサーションZend_Aclを使用できます。

例えば:

class My_Acl_IsProfileComplete implements Zend_Acl_Assert_Interface
{
    protected $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

   public function assert(Zend_Acl $acl, 
                           Zend_Acl_Role_Interface $role = null,
                           Zend_Acl_Resource_Interface $resource = null,
                           $privilege = null)
    {
        // check the user's profile
        if (null === $this->user){
            return false;
        }
        return $this->user->isProfileComplete();  // for example
    }
}

次に、Acl オブジェクトを定義するとき:

$user = Zend_Auth::getInstance()->getIdentity();
$assertion = new My_Acl_Assertion_IsProfileComplete($user);
$acl->allow($role, $resource, $privilege, $assertion);

もちろん、詳細の一部は、確認する必要があるものの詳細に依存し、Zend_Auth::setIdentity()呼び出しで何を使用できるかは、ユーザー ID のみ、完全なユーザー オブジェクトなどに依存します。また、役割、リソース、権限は完全にアプリ固有です。しかし、うまくいけば、これでアイデアが得られます。

また、アサーション オブジェクトはインスタンス化時にユーザー オブジェクトを必要とするため、この動的ルールを Bootstrap で追加することはできません。ただし、ブートストラップ中に静的ルールを使用してコア Acl インスタンスを作成しpreDispatch()、動的アサーションを追加するフロント コントローラー プラグインを (たとえば、で実行するために) 登録することができます。このようにして、コントローラーをチェックしていると思われる場所に到達するまでに、Acl は完全に設定されます。

大声で考えているだけです。

于 2011-12-18T00:09:15.047 に答える