gpt4 book ai didi

authentication - Pyramid - 如何根据资源工厂配置多个禁止 View ?

转载 作者:行者123 更新时间:2023-12-04 04:49:20 24 4
gpt4 key购买 nike

我有一个 Pyramid 项目,有两部分:

  • /_hq/需要通过登录页面进行身份验证
  • /_rest/需要 RESTful 身份验证(通过 HTTP 基本/摘要式身份验证)

  • 因此,我添加了包含 2 个主要资源工厂的路由:HQFactory 和 RESTFactory。我已经构建了一个身份验证策略切换器来切换每个资源的 AuthenticationPolicy。有效。

    我也使用 ACLAuthorizationPolicy。

    对于每个请求,我想返回一个登录页面或 401 HTTP 状态取决于正在访问的资源工厂。

    我的问题是我只能为一个 View 执行 @forbidden_​​view_config。如何指定每个资源工厂的投标 View 或针对我的问题的其他解决方案?

    谢谢

    已解决 - 解决方案

    最简单的方法是 Michael Merickel 的回答(你可以在下面看到) .这里还有另一种方式:

    已弃用

    我通过使用 view_config 中的 custom_predicates arg 解决了我的问题。就是这样。

    我创建了一个函数作为自定义谓词:
    def resource_factory_predicate(factory):
    def check_factory(context, request):
    return isinstance(request.context, factory)
    return check_factory

    然后,这是我的 views.py
    # views.py
    @forbidden_view_config(
    custom_predicates=(resource_factory_predicate(RootFactory),))
    def login_required(request):
    userid = authenticated_userid(request)

    if userid is not None:
    return HTTPForbidden("You're not authorized for this action")

    # redirect to login page


    @forbidden_view_config(renderer='json',
    custom_predicates=(resource_factory_predicate(RESTfulFactory),))
    def http_403_unauthenticated(request):
    request.response.status = 403
    return {
    'status': 0,
    'message': 'Forbidden',
    }

    最佳答案

    虽然您不能基于上下文调度异常 View (异常用作上下文),但可以欺骗并使用 containment要求指定类型在 lineage 中的选项的实际情况。这意味着如果它下面的任何上下文引发异常,它也会匹配,影响遍历层次结构的整个子树。

    @forbidden_view_config(containment=MyRootA)
    def root_a_forbidden(exc, request):
    # note that the actual context is available on request.context
    pass

    @forbidden_view_config(containment=MyRootB)
    def root_b_forbidden(exc, request):
    pass

    关于authentication - Pyramid - 如何根据资源工厂配置多个禁止 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17674288/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com