HTTPЗапрещенный контекстный маршрут не запускается - PullRequest
3 голосов
/ 15 октября 2011

У меня проблемы с настройкой безопасности в пирамиде.Кажется, работает моя защита: если пользователь пытается получить доступ к ресурсу, доступ к которому у него нет прав, 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

Для всех представлений по умолчанию установлено разрешение 'view', my 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, все будет работать как обычно.

Буду признателен за любые указания относительно того, где я иду не так.

Ответы [ 3 ]

1 голос
/ 20 октября 2011

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

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

0 голосов
/ 24 ноября 2011

Вы можете добавить «разрешение = NO_PERMISSION_REQUIRED» в ваш view_config

from pyramid.security import NO_PERMISSION_REQUIRED
@view_config(context = HTTPForbidden, renderer="login.mak", permission=NO_PERMISSION_REQUIRED)
0 голосов
/ 02 ноября 2011

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

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

...