Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 17, 2012 14:34:49

sank
Зарегистрирован: 2012-10-05
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid: Аутентификация с условием

Никак не могу на просторах нэта найти решение следующей проблемы:
Использую встроенный 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)

А можно ли как-то красиво сказать пирамиде, чтобы она проверила ещё какой-то признак клиента, прежде чем решить вопрос доступности ресурса?

Офлайн

#2 Окт. 17, 2012 14:42:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Pyramid: Аутентификация с условием

ЕМНИП это делается в роутинге с помощью фабрики



Офлайн

#3 Окт. 17, 2012 15:08:18

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Pyramid: Аутентификация с условием

Офлайн

#4 Окт. 17, 2012 17:15:40

sank
Зарегистрирован: 2012-10-05
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid: Аутентификация с условием

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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version