Контекстный маршрут HTTPForbidden не срабатывает

У меня возникли проблемы с правильной работой системы безопасности в Pyramid. Сама моя система безопасности, кажется, работает: если пользователь пытается получить доступ к ресурсу, на просмотр которого он не имеет права, Pyramid выдает исключение HTTPForbidden. Проблема в том, что в этом случае он должен вернуться к представлению входа в систему, чего не происходит. Я просто получаю экран исключения Pyramid по умолчанию с трассировкой стека.

мой вид входа:

from pyramid.httpexceptions import HTTPForbidden

@view_config(context = HTTPForbidden, renderer="login.mak")
@view_config(route_name = 'login', renderer='login.mak')
class Login(ViewBase):
    def __init__(self, request):
        super(Login, self).__init__(request)
        self.data['title'] = "Login"

        if request.method == 'POST':
            name = request.params['username']
            passwd = request.params['password']
            validuser = User.check(name, passwd)
            if validuser is None:
                self.data['requested_path'] = request.params['requestpath']
                self.__call__()
            else:
                headers = remember(request, str(validuser.id))
                raise HTTPFound(
                    location = request.params['requestpath'],
                    headers = headers
                    )
        else:
            self.data['requested_path'] = request.url

    def __call__(self):
        return self.data

Все представления имеют разрешение по умолчанию, установленное на «просмотр», мой класс acl выглядит следующим образом:

from pyramid.security import Allow
from pyramid.security import Everyone
from pyramid.security import Authenticated
from pyramid.security import ALL_PERMISSIONS

# Handles ACL auth for the entire application

class RootFactory(object):

    __acl__ = [
        (Allow, Everyone, 'view'),
        (Allow, 'Editor', 'edit'),
        (Allow, 'Admin', ALL_PERMISSIONS)
    ]

    def __init__(self, request):
        pass

def groupfinder(userid, request):

    from ctic.models import User

    user = User.get(userid)
    member_groups = []
    if user != None:
        member_groups.append(user.group.groupname)
        return member_groups
    else:
        return None

Как я уже сказал, аспект ACL, кажется, работает.

Интересно, если я удалю default_permission из своего init.py, все работает как обычно.

Любые указатели относительно того, где я ошибаюсь, будут оценены.


person richzilla    schedule 14.10.2011    source источник


Ответы (3)


Это, вероятно, не связано с вашей проблемой, но представление на основе классов в Pyramid состоит в том, что это двухэтапный процесс. 1) Пирамида создает экземпляр вашего класса с объектом request 2) Пирамида вызывает либо метод __call__, либо метод, указанный attr в view_config. Таким образом, вызов self.__call__() в вашем __init__ некорректен.

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

person Michael Merickel    schedule 20.10.2011

Ваш groupfinder() должен возвращать список во всех случаях. Если пользователь не состоит ни в одной группе, верните [] вместо None.

Я не уверен, что это ваша проблема. Но у меня было подобное поведение, когда я вернул None вместо [].

person lukecyca    schedule 01.11.2011
comment
во всех случаях неверно. У средства поиска группы есть 2 цели: 1) определить, аутентифицирован ли пользователь — это делается путем возврата None, если пользователь не вошел в систему, или списка, если они есть 2) определить, какие участники есть у пользователя — это означает заполнение возвращаемого списка с субъектами, которые сопоставляются со списками управления доступом в вашей системе. Групповой поиск в его примере делает это правильно. - person Michael Merickel; 02.11.2011

вы можете добавить «permission=NO_PERMISSION_REQUIRED» в свой view_config

from pyramid.security import NO_PERMISSION_REQUIRED
@view_config(context = HTTPForbidden, renderer="login.mak", permission=NO_PERMISSION_REQUIRED)
person Akasha    schedule 24.11.2011