Интерфейс администратора Pyramid и FormAlchemy

#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)