Найти - Пользователи
Полная версия: Pyramid: Аутентификация с условием
Начало » Pyramid / Pylons / TurboGears » Pyramid: Аутентификация с условием
1
sank
Никак не могу на просторах нэта найти решение следующей проблемы:
Использую встроенный Security механизм в пирамиде, как описано в туториале.
Только мне нужно, чтобы юзера, роли и т.п. читались из базы данных.
Тут вроде всё просто, всё работает, но теперь возникла проблемка - нужно проверять права не просто на весь view, а проверять права при срабатывании некоторых условий.

Например:
У меня есть view, который отображает клиента.
Переходим по ссылке http://localhost/client/58
Внутри view выбираем клиента, смотрим какой он группе принадлежит.
Если клиент принадлежит какой-то группе, то давать юзеру доступ, иначе не давать.

В пирамиде на весь view можно выдать права:
@view_config(route_name='client.view', renderer='../templates/client/view.pt', permission='read')
def cview(request):
    cid = request.matchdict['id']
    client =  DBSession.query(Client).filter_by(id=cid).first()
    return dict(client=client)

А можно ли как-то красиво сказать пирамиде, чтобы она проверила ещё какой-то признак клиента, прежде чем решить вопрос доступности ресурса?
FishHook
ЕМНИП это делается в роутинге с помощью фабрики
ziro
Делается примерно так: https://github.com/mmerickel/pyramid_auth_demo/blob/master/2.object_security/demo.py
sank
ziro
Делается примерно так: https://github.com/mmerickel/pyramid_auth_demo/blob/master/2.object_security/demo.py

Огромнейшее спасибо! То, что доктор прописал!

Кому актуально, сделал так:
В общем добавил фабрику для рута своего, траверс прописал:
    config.add_route('client.view', '/clients/view/{id}', factory=ClientFactory, traverse='/{id}')
Потом рисуем фабрику, где строим ACL так, как нам нужно:
class ClientFactory(object):
    @property
    def __acl__(self):
        # здесь строим ACL в засисмости от ваших условий
        acl = []
        # тут ваши условия ... бла-бла :)
        if self.client.group==3:
            acl += [(Allow, 'admin', ALL_PERMISSIONS)]
        if self.client.group==5:
            acl += [(Allow, 'users', ALL_PERMISSIONS)]
        return acl
    def __init__(self, request):
        self.request = request
    def __getitem__(self, key):
        client = DBSession.query(Client).filter_by(id=key).first()
        client.__parent__ = self
        client.__name__ = key
        self.client = client
        return client
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB