2

私は最近ZendFrameworkを使い始めましたが、session_startにかなり慣れていて、特定のセッション名に変数を割り当てています(つまり、$ _ SESSION ['username'] == $ username)

私はZendでこれに似た何かをする方法を見つけようとしています。現在、認証スクリプトはLDAPを使用してADサーバーに対して資格情報を確認し、成功した場合はユーザーを認証します。

管理者ユーザーが他のユーザーのセッションに簡単に「入る」ことができるスクリプトを作成したいと思います。admin1にアクティブなセッションがあり、user1のセッションに切り替えたいとしましょう。通常は、$ _ SESSION ['username']変数を変更するだけで、ログインしているユーザーのIDを効果的に変更します。

しかし、Zendでは、セッション情報を変更する方法がよくわかりません。価値のあるものとして、これが私の認証スクリプトです。

class LoginController extends Zend_Controller_Action
{
    public function getForm()
    {
        return new LoginForm(array(
            'action' => '/login/process',
            'method' => 'post',
        ));
    }

    public function getAuthAdapter(array $params)
    {
        $username = $params['username'];
        $password = $params['password'];
        $auth = Zend_Auth::getInstance();

        require_once 'Zend/Config/Ini.php';
        $config = new Zend_Config_Ini('../application/configs/application.ini', 'production');
        $log_path = $config->ldap->log_path;
        $options = $config->ldap->toArray();
        unset($options['log_path']);

        require_once 'Zend/Auth/Adapter/Ldap.php';
        $adapter = new Zend_Auth_Adapter_Ldap($options, $username, $password);

        $result = $auth->authenticate($adapter);

        if ($log_path) {
            $messages = $result->getMessages();

            require_once 'Zend/Log.php';
            require_once 'Zend/Log/Writer/Stream.php';
            require_once 'Zend/Log/Filter/Priority.php';
            $logger = new Zend_Log();
            $logger->addWriter(new Zend_Log_Writer_Stream($log_path));
            $filter = new Zend_Log_Filter_Priority(Zend_Log::DEBUG);
            $logger->addFilter($filter);

            foreach ($messages as $i => $message) {
                if ($i-- > 1) { // $messages[2] and up are log messages
                    $message = str_replace("\n", "\n  ", $message);
                    $logger->log("Ldap: $i: $message", Zend_Log::DEBUG);
                }
            }
        }
        return $adapter;
    }
    public function preDispatch()
    {
        if (Zend_Auth::getInstance()->hasIdentity()) {
            // If the user is logged in, we don't want to show the login form;
            // however, the logout action should still be available
            if ('logout' != $this->getRequest()->getActionName()) {
                $this->_helper->redirector('index', 'index');
            }
        } else {
            // If they aren't, they can't logout, so that action should
            // redirect to the login form
            if ('logout' == $this->getRequest()->getActionName()) {
                $this->_helper->redirector('index');
            }
        }
    }
    public function indexAction()
    {
        $this->view->form = $this->getForm();
    }
    public function processAction()
    {
        $request = $this->getRequest();

        // Check if we have a POST request
        if (!$request->isPost()) {
            return $this->_helper->redirector('index');
        }

        // Get our form and validate it
        $form = $this->getForm();
        if (!$form->isValid($request->getPost())) {
            // Invalid entries
            $this->view->form = $form;
            return $this->render('index'); // re-render the login form
        }

        // Get our authentication adapter and check credentials
        $adapter = $this->getAuthAdapter($form->getValues());
        $auth    = Zend_Auth::getInstance();
        $result  = $auth->authenticate($adapter);
        if (!$result->isValid()) {
            // Invalid credentials
            $form->setDescription('Invalid credentials provided');
            $this->view->form = $form;
            return $this->render('index'); // re-render the login form
        }

        // We're authenticated! Redirect to the home page

        $this->_helper->redirector('index', 'index');

    }
    public function logoutAction()
    {
        Zend_Auth::getInstance()->clearIdentity();
        $this->_helper->redirector('index'); // back to login page
    }
}

私が説明したことを行う方法はありますか?提案をありがとう。

4

1 に答える 1

2

コードを指定すると、認証の結果はZend_Auth_Storage_Sessionオブジェクトを介して PHP セッションに保存されます。

呼び出しZend_Auth::getIdentity()はストレージへのアクセスを取得し、空でない場合は結果を返します。同様に、基になるストレージにアクセスしてその値を変更することで、保存されている ID を変更できます。認証の結果として保存される実際の IDZend_Auth_Adapter_Ldapは、LDAP ユーザー名を表す単なる文字列値です。

ログインしているユーザーを効果的に変更するには、次のようにします。

Zend_Auth::getInstance()->getStorage()->write('newUserName');

これは、コードが与えられているはずのデフォルトの動作を想定しています。

認証が成功した後にアプリケーションで行うことは、いくつかの User モデルの新しいオブジェクトを作成し、それを Zend_Auth セッションに書き込むことです。これにより、各セッションで利用可能なユーザーに関するより多くの情報を取得できるようになります。用途に応じて収納できます。

これは私が例えばすることです:

$auth       = new Zend_Auth(...);
$authResult = $auth->authenticate();

if ($authResult->isValid() == true) {
    $userobj = new Application_Model_UserSession();
    // populate $userobj with much information about the user
    $auth->getStorage()->write($userobj);
}

これで、呼び出したアプリケーションのどこでも、文字列ではなくオブジェクトZend_Auth::getInstance()->getIdentity()が返されます。Application_Model_UserSessionしかし、私は脱線します。

役立つ情報は次のとおりです。

$user = Zend_Auth::getInstance()->getIdentity(); // reads from auth->getStorage()

Zend_Auth::getInstance()->getStorage()->write($newUser);
于 2012-06-11T23:43:42.180 に答える