Пирамидальный и FormAlchemy интерфейс администратора - PullRequest
5 голосов
/ 15 апреля 2011

У меня есть проект пирамиды, использующий интерфейс администратора формальной химии. Я добавил базовую аутентификацию ACL, а плагин pyramid_formalchemy всегда отказывает, даже если я аутентифицирован.

Есть мысли о том, как разрешить только аутентифицированным пользователям использовать интерфейс администратора pyramid_formalchemy?

Политика авторизации была добавлена ​​так:

authn_policy = AuthTktAuthenticationPolicy('MYhiddenSECRET', callback=groupfinder)
authz_policy = ACLAuthorizationPolicy()

config = Configurator(
   settings=settings,
   root_factory='package.auth.RootFactory',
   authentication_policy=authn_policy,
   authorization_policy=authz_policy
)

# pyramid_formalchemy's configuration
config.include('pyramid_formalchemy')
config.include('fa.jquery')
config.formalchemy_admin('admin', package='package', view='fa.jquery.pyramid.ModelView')

1 Ответ

11 голосов
/ 15 апреля 2011

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__, он будет смотреть на происхождение дерева ресурсов, пока не достигнет 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)
...