Рефакторинг реализации Zend_Auth - PullRequest
1 голос
/ 27 сентября 2010

Я работаю над существующим проектом, в котором есть две области, в которые можно войти. Раздел администратора и интерфейс.

В настоящее время в разделе администратора есть действие для входа в систему, а для внешнего интерфейса - собственное действие для входа в систему. Администратор входит в систему с использованием таблицы базы данных специально для учетных записей администраторов, а внешний интерфейс - с использованием другой таблицы.

Если администратор вошел в систему и пытается затем войти во внешний интерфейс, им предлагается войти в систему как пользовательский интерфейс (необходимо, потому что пользовательские интерфейсы получают совершенно другой контент в зависимости от проектов, с которыми они связаны, а администратор - нет). связан с одним конкретным проектом).

После того, как вы вошли в систему как пользователь переднего плана, его учетные данные администратора пропали, и им придется снова войти в систему, если они попытаются повторно войти в раздел администратора.

Я хочу сделать так, чтобы администратор мог войти в раздел администрирования и войти в систему как определенный пользователь переднего плана. Таким образом, можно переключаться между двумя разделами сайта. без повторного входа.

Как лучше всего справиться с этим в Zend Framework?

Пока что я думаю о том, чтобы потерять отдельные действия при входе в систему и иметь только одно (нет необходимости в двух, верно?), А затем мне приходится иметь дело с разрешением раздельных учетных данных.

В настоящее время вход в систему как пользователь переднего плана приводит к тому, что пользователю с правами администратора необходимо войти в систему, чтобы получить доступ к области администратора. Это потому, что некоторые учетные данные $ _SESSION перезаписываются? Нужно ли каким-то образом создавать собственную переменную $ _SESSION, чтобы справиться с этим способом ZF?

Очевидно, что я не могу просто напрямую присвоить значение $ _SESSION ['front_end'] или $ _SESSION ['admin'] (что я бы сделал в тот день), так как бы я сделал это в Zend Framework?

Спасибо!

1 Ответ

1 голос
/ 28 сентября 2010

Первый вопрос, вам действительно нужно это сделать? Предполагая, что пользователи с правами администратора могут получить доступ ко всем проектам, типичным подходом к этому будет дать администраторам раскрывающийся список во внешнем интерфейсе, который перечисляет все проекты и позволяет им переключаться между ними. После того, как они выбрали один, этот выбор сохраняется в их сеансе, и они могут просматривать данные, как если бы они вошли в систему как один из этих пользователей. Затем они могут переключаться между проектами по желанию.

Если вам действительно нужны два входа, это, безусловно, должно быть возможно. По умолчанию Zend_Auth использует класс Zend_Auth_Storage_Session для хранения результата аутентификации в сеансе. Этот класс использует пространство имен сеанса 'Zend_Auth' по умолчанию (т.е. данные хранятся в $_SESSION['Zend_Auth']), поэтому, когда ваш интерфейсный пользователь успешно входит в систему с правами администратора, его данные аутентификации сеанса перезаписываются результатом аутентификации администратора. Итак, вы хотите, чтобы Zend_Auth_Storage_Session использовал другое пространство имен для имен администратора (или настраиваемое пространство имен для каждого).

Теоретически вы должны быть в состоянии сделать что-то вроде этого:

public function loginAction()
{
    $auth = Zend_Auth::getInstance();
    if (...) { // check some condition that returns true for admin logins
        // setup storage with custom admin namespace (can be any string)
        $authStorage = new Zend_Auth_Storage_Session('Yourapp_Admin_Auth');
    } else {
        // use defaults
        $authStorage = new Zend_Auth_Storage_Session();
    }
    $auth->setStorage($authStorage);

    // carry on login as normal
    [...]
}

Итак, Zend_Auth использует $_SESSION['Yourapp_Admin_Auth'] для входа администратора и значение по умолчанию $_SESSION['Zend_Auth'] для внешнего интерфейса.

...