#python #authorization #acl #pyramid #formalchemy
#python #авторизация #acl #пирамида #formalchemy
Вопрос:
У меня есть проект pyramid, использующий интерфейс администратора formalchemy. Я добавил базовую аутентификацию ACL, а плагин pyramid_formalchemy всегда отклоняется, даже если я аутентифицирован.
Есть мысли о том, как разрешить только аутентифицированным пользователям использовать интерфейс администратора pyramid_formalchemy?
Политика авторизации была добавлена следующим образом:
authn_policy = AuthTktAuthenticationPolicy('MYhiddenSECRET', обратный вызов=groupfinder) authz_policy = ACLAuthorizationPolicy() config = Конфигуратор( настройки=settings, root_factory='package.auth.RootFactory', authentication_policy=authn_policy, authorization_policy=authz_policy ) # конфигурация pyramid_formalchemy config.include('pyramid_formalchemy') config.include('fa.jquery') config.formalchemy_admin('admin', package='пакет', view='fa.jquery.pyramid.ModelView')
Ответ №1:
pyramid_formalchemy
использует разрешения 'view', 'edit', 'delete', 'new'
, чтобы определить, кто что может делать. __acl__
Распространяется вниз из вашего объекта модели SQLAlchemy. Таким образом, вам нужно поставить __acl__
на каждый из ваших объектов модели, предоставляя нужным группам доступ к этим разрешениям. Например, из pyramid_formalchemy
pyramidapp
примера проекта:
class Bar(Base):
__tablename__ = 'bar'
__acl__ = [
(Allow, 'admin', ALL_PERMISSIONS),
(Allow, 'bar_manager', ('view', 'new', 'edit', 'delete')),
]
id = Column(Integer, primary_key=True)
foo = Column(Unicode(255))
Конечно, если вы не укажете __acl__
, то он будет отображаться в lineage дерева ресурсов, пока не попадет в factory
. По умолчанию pyramid_formalchemy
определяет свою собственную фабрику pyramid_formalchemy.resources.Models
, однако вы можете подклассировать ее и предоставить __acl__
ей как глобальную для всех ваших моделей:
from pyramid_formalchemy.resources import Models
class ModelsWithACL(Models):
"""A factory to override the default security setting"""
__acl__ = [
(Allow, 'admin', ALL_PERMISSIONS),
(Allow, Authenticated, 'view'),
(Allow, 'editor', 'edit'),
(Allow, 'manager', ('new', 'edit', 'delete')),
]
config.formalchemy_admin('admin', package='package', view=..., factory=ModelsWithACL)