Zend authenticate возвращает белый экран

Это самый неприятный из всех. Почти невозможно найти ошибки, когда все, что вы получаете, это белый экран!!!

Этот код используется в других проектах, и он прекрасно работает там, так что синтаксически, это правильно. Но что-то должно быть неправильно в конфигурации...

Вот код:

protected function _process($values)
{
    // Get our authentication adapter and check credentials
    $adapter = $this->_getAuthAdapter();
    $adapter->setIdentity($values['username']);
    $adapter->setCredential($values['password']);

    $auth = Zend_Auth::getInstance();
    $result = $auth->authenticate($adapter);

    if ($result->isValid()) {
        $user = $adapter->getResultRowObject();
        $auth->getStorage()->write($user);
        return true;
    }
    return false;
}

protected function _getAuthAdapter()
{
    $dbAdapter = Zend_Db_Table::getDefaultAdapter();
    $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
    $authAdapter->setTableName('Users')
                ->setIdentityColumn('username')
                ->setCredentialColumn('password')
                ->setCredentialTreatment('md5(?)');
    return $authAdapter;
}

Это находится в моем контроллере аутентификации и вызывается после того, как я установил адаптер и т. Д. Если я вставлю кристалл ("foo"); прямо перед строкой $result, я вижу это. Если я поставлю его сразу после строки результата $, я получу WSOD, и система остановится. Я знаю, что здесь недостаточно для того, чтобы кто-нибудь мог отладить мой код, но я надеялся, что у кого-то еще возникла эта проблема, и он мог бы дать мне подсказку о том, что пытаться исправить это??? Я дважды проверил базу данных, имена столбцов и т. Д. Мне нужно знать, что может сделать строка:

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

в результате белый экран смерти??? Есть идеи? У меня все отображение ошибок включено в application.ini.

Я использую Zend 1.11.12 на этом сервере. Это имеет значение? Сервер, на котором он работает, работает 1.12.0-9

Спасибо за любые идеи, которые вы могли бы иметь.

РЕДАКТИРОВАТЬ::: Я добавил код для моего _getAuthAdapter.

4 ответа

Решение

Включите отчеты об ошибках для вашего приложения. Установите для всех отчетов об ошибках 1 в файле configs/application.ini -

   phpSettings.display_startup_errors = 1
   phpSettings.display_errors = 1
   resources.frontController.params.displayExceptions = 1

Кроме того, вместо того, чтобы возвращать true или false, попробуйте напечатать сообщение или перенаправить на другую страницу, чтобы узнать.

Попробуйте var_dump на адаптере $, чтобы увидеть полученный объект.

Если ваш адаптер не работает, попробуйте:

public function _getAuthAdapter() {
        $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter());
        $authAdapter->setTableName('table_name')
                ->setIdentityColumn('user_name')
                ->setCredentialColumn('password');
        return $authAdapter;
}

И в приложении.ini

resources.db.isDefaultTableAdapter = true

Я пытался, как показано ниже,

  public function loginAction() {
        $this->_helper->layout->disableLayout();
        $users = new Application_Model_DbTable_Admin();
        $this->_redirector = $this->_helper->getHelper('Redirector');
        $form = new Application_Form_LoginForm();
        $this->view->form = $form;

        if ($this->getRequest()->isPost()) {
            if ($form->isValid($_POST)) {
                $consumer = new Zend_OpenId_Consumer();
                $username = $this->_request->getPost('username');
                $password = $this->_request->getPost('password');

                if ($username <> '' && $password <> '') {
                    $auth = Zend_Auth::getInstance();
                    $authAdapter = new Zend_Auth_Adapter_DbTable($users->getAdapter(), 'admin');
                    $authAdapter->setIdentityColumn('username')
                            ->setCredentialColumn('password');
                    $authAdapter->setIdentity($username)
                            ->setCredential(md5($password));
                    $result = $auth->authenticate($authAdapter);

                    if ($result->isValid()) {
                        $storage = new Zend_Auth_Storage_Session();
                        $storage->write($authAdapter->getResultRowObject());
                        $this->_auth_user = $auth->getStorage()->read();
                        $this->_redirect('admin/index/');
                    }
                    else
                        $this->view->errorMessage = "Invalid username or password. Please try again.";
                }
                else
                    $this->view->errorMessage = "Username or password should not be empty!!!.";
            }
        }
    }

Я никогда не использовал Zend_Auth аутентифицировать. Вы должны быть в состоянии сделать это с вашим адаптером. (при условии, что ваш $adapter это пример Zend_Auth_Adapter_DbTable например)

$adapter = $this->_getAuthAdapter();

// this will tell you if there's something wrong with your adapter
if (!($adapter instanceof Zend_Auth_Adapter_DbTable)) {
    throw new Exception('invalid adapter');
}

$adapter->setIdentity($values['username']);
$adapter->setCredential($values['password']);

$result = $adapter->authenticate();
if ($result->isValid()) {

}
Другие вопросы по тегам