Как заставить пользователя войти в систему для просмотра любой страницы? - PullRequest
1 голос
/ 25 мая 2009

Я сейчас играю с Zend Framework, и я написал код аутентификации, используя Zend_Auth. Я пытаюсь найти способ убедиться, что пользователь вошел в систему, прежде чем он сможет что-либо просмотреть, но я не хочу делать это для каждого контроллера.

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

Ответы [ 5 ]

2 голосов
/ 25 мая 2009
Zend_Auth::getInstance()->hasIdentity()

Вы можете использовать это, чтобы определить, вошел ли пользователь в систему, а затем использовать перенаправитель для перенаправления на страницу входа, если нет.

Однако проще всего использовать Redirector Zend Controller Action Helper .

1 голос
/ 27 мая 2009

Как насчет установки глобального контроллера, который расширяет Zend_Controller_Action, а затем позволяет вашим контроллерам расширяться от глобального контроллера. Затем ваш глобальный контроллер помещает Zend_Auth :: getInstance () -> hasIdentity () в init () или preDispatch?

1 голос
/ 26 мая 2009

Просмотрите Zend ___ Acl , который можно использовать для определения, имеет ли пользователь доступ к определенным ресурсам. Ресурс может быть почти любым, но в этом контексте вы можете использовать ACL для определения ваших контроллеров и действий как ресурсов. Каждому вошедшему в систему пользователю назначается определенное количество ролей (мы сохраняем их в базе данных). В плагине вы проверяете запрос на Controller и Action после завершения маршрутизации. Соберите роли пользователя через Zend_Auth и сравните их с ACL. Если ACL сообщает, что у пользователя есть разрешение на доступ к ресурсу, ничего не делайте, иначе вы можете переадресовать / перенаправить на контроллер ошибок и распечатать ошибку.

// Pseudo-code. You need to define the ACL and roles somehow.
class AclPlugin extends Zend_Controller_Plugin {
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {

        $controller = $request->getControllerName();
        $action = $request->getActionName();
        $roles = Zend_Auth::getInstance()->getRoles();
        $acl = new MyAcl();
        if($acl->hasAccess($roles, $controller, $action)) { return; }
        // None of the user's roles gave her access to the requested 
        // controller/action, so re-write the request to the error controller
        $request->setControllerName('error')
                ->setActionName('authorizationFailed')
                ->setParam('resource', array('controller' => $controller
                                             'action' => $action));
    }
}
class MyAcl extends Zend_Acl {
    public function hasAccess($roles, $controller, $action) {
        foreach($roles as $role) {
            if($acl->isAllowed($role, $controller, $action)) {
                return true; // Simplified. Here we say if one of the user roles can
                             // access a resource, that is good enough. 
                             // Might want to do something a bit more complicated.
            }
        }
        return false;
    }
}
1 голос
/ 25 мая 2009

Плагин это хорошая идея. Я ответил на аналогичный вопрос здесь:

Как централизовать код из моих функций инициализации во всех контроллерах?

Также проверьте страницу документации Плагины Zend Controller

0 голосов
/ 25 мая 2009

В последнее время я размышлял над этой же темой (новичок ZF) и думал о проверке подлинности в начальной загрузке (возможно, со списком «обойденных» контроллеров / действий).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...