首页 > 解决方案 > 金字塔安全性:如何提前检测对视图的授权

问题描述

我有一个金字塔应用程序,使用金字塔安全:https ://docs.pylonsproject.org/projects/pyramid/en/latest/narr/security.html

它工作正常,即它完全按照我的意思保护我的应用程序,但是为了知道“我”(用户)是否被授权访问视图,唯一的方法似乎是查看视图本身并获取未授权页面。

有没有办法提前知道用户是否有权查看?这对于隐藏用户无权访问的链接很有用。

例如,在一个视图中,我想要一个类似的方法:

some_authorization_object.authorized_to_view('view_name')

或类似的东西。

先感谢您

标签: pythonauthenticationauthorizationpyramid

解决方案


感谢回答者的帖子,我能够设计出最终解决方案。

最终解决方案的关键是 request.registry.introspector.categorized() 方法,它提供了一个(相当复杂但仍然可读的)视图结构,以某种方式“加入”了权限;这样就可以找到查看视图所需的权限,然后使用 has_permission() 方法,最终可以确定用户是否具有查看视图的权限。

步骤如下:

  • 承认有一个分类的数据结构,即: request.registry.introspector.categorized()

  • 获取视图相关权限的数据源,用我们感兴趣的视图(view_name)过滤:

    # Get a list of views:
    views_list = [
        v for v in request.registry.introspector.categorized() if v[0] == 'views'
    ][0][1]
    # From the list, select the one with the name we are looking for:
    related_permissions_source = [
        v["related"] for v in views_list if
        view_name in v["introspectable"].discriminator
    ]
    
  • 提取查看视图所需的权限名称列表:

    view_related_permissions = [ rel for rel in related_permissions_source[0] if rel.category_name == "permissions" ] permission_names = [ rper.discriminator for rper in view_related_permissions ]

  • 最后,对于 view_related_permissions 的每个元素,检查当前用户是否被授权:

    request.has_permission(permission)

用户有权访问的第一次出现表明用户有权查看该视图。


推荐阅读