0

わかりましたので、資格情報がデータベースにある場合、ユーザーを制限されたエリアに誘導するユーザーログインシステムを備えた zf アプリケーションを用意しました。ただし、同じログインフォームで、ユーザーの役割が管理者 (DB 内) であるかどうかを確認し、管理者セクションに移動するかどうかを確認したい... Zend_Acl を使用してこれを行う方法を理解するのに苦労しています。また、ACL の唯一の用途は、admin ロールを持つユーザーを admin セクションに許可することです。私は ZF にかなり慣れていないため、最善のアプローチが何であるかわかりません..AuthController の現在のコードは次のとおりです。

http://codepaste.net/6hzydv

ありがとう

4

2 に答える 2

2

ユーザーがロールに基づいてコントローラー/ビューにアクセスする権限を持っているかどうかを決定するコントローラープラグインを作成できます。何かのようなもの:

class My_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $auth = Zend_Registry::getInstance()->get('auth');
        $acl = new Zend_Acl();

        // for default module
        if ($request->getModuleName() == 'default') {

            // access resources (controllers)
            // usually there will be more access resources
            $acl->add(new Zend_Acl_Resource('index'));
            $acl->add(new Zend_Acl_Resource('error'));

            // access roles
            $acl->addRole(new Zend_Acl_Role('guest'));
            $acl->addRole(new Zend_Acl_Role('user'));
            $acl->addRole(new Zend_Acl_Role('administrator'));

            // access rules
            $acl->allow('guest'); // allow guests everywhere
            $acl->allow('user'); // allow users everywhere
            $acl->allow('administrator'); // allow administrators everywhere

            $role = ($auth->getIdentity() && $auth->getIdentity()->status = 'approved')
            ? $auth->getIdentity()->role : 'guest';
            $controller = $request->getControllerName();
            $action = $request->getActionName();

            if (!$acl->isAllowed($role, $controller, $action)) {
                $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
                $redirector->gotoUrlAndExit('error/denied');
            }

        }
        // for member module
        else if ($request->getModuleName() == 'member') {

            // access resources (controllers)
            // usually there will be more access resources
            $acl->add(new Zend_Acl_Resource('index'));
            $acl->add(new Zend_Acl_Resource('error'));

            // access roles
            $acl->addRole(new Zend_Acl_Role('guest'));
            $acl->addRole(new Zend_Acl_Role('user'));
            $acl->addRole(new Zend_Acl_Role('administrator'));

            // access rules
            $acl->allow('user'); // allow users everywhere
            $acl->allow('administrator'); // allow administrators everywhere

            $role = ($auth->getIdentity() && $auth->getIdentity()->status = 'approved')
            ? $auth->getIdentity()->role : 'guest';
            $controller = $request->getControllerName();
            $action = $request->getActionName();

            if (!$acl->isAllowed($role, $controller, $action)) {
                $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
                $redirector->gotoUrlAndExit('error/denied');
            }

        }
        // for admin module
        else if ($request->getModuleName() == 'admin') {

            // access resources (controllers)
            // usually there will be more access resources
            $acl->add(new Zend_Acl_Resource('index'));
            $acl->add(new Zend_Acl_Resource('error'));

            // access roles
            $acl->addRole(new Zend_Acl_Role('guest'));
            $acl->addRole(new Zend_Acl_Role('user'));
            $acl->addRole(new Zend_Acl_Role('administrator'));

            // access rules
            $acl->allow('administrator'); // allow administrators everywhere

            $role = ($auth->getIdentity() && $auth->getIdentity()->status = 'approved')
            ? $auth->getIdentity()->role : 'guest';
            $controller = $request->getControllerName();
            $action = $request->getActionName();

            if (!$acl->isAllowed($role, $controller, $action)) {
                $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
                $redirector->gotoUrlAndExit('error/denied');
            }

        }
    }
}

ここでステップバイステップのチュートリアルを見ることができます: http://blog.richardknop.com/2009/06/user-login-and-authentication-with-zend_auth-and-zend_acl/

于 2012-04-10T16:28:52.353 に答える
0

Zend Aclのドキュメントを読んで、パーミッションを付与し、ユーザー タイプごとにパーミッションを継承する方法を理解してください。次に、Zend Acl & MVC に関するこのかなり単純な Zend チュートリアルを確認してください。

基本的には、次のことを行うだけです。

  1. ブートストラップのどこかに ACL ルールを設定する
  2. クレートerror/denied.phtml(または使用している拡張機能)
  3. Zend_Controller_Plugin_Aclあなたのために汚い仕事をさせてください
于 2012-04-11T04:15:14.643 に答える