Форум сайта python.su
Никак не могу на просторах нэта найти решение следующей проблемы:
Использую встроенный 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)
Офлайн
ЕМНИП это делается в роутинге с помощью фабрики
Офлайн
Делается примерно так: https://github.com/mmerickel/pyramid_auth_demo/blob/master/2.object_security/demo.py
Офлайн
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}')
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
Офлайн