python - 金字塔安全性:如何提前检测对视图的授权
问题描述
我有一个金字塔应用程序,使用金字塔安全:https ://docs.pylonsproject.org/projects/pyramid/en/latest/narr/security.html
它工作正常,即它完全按照我的意思保护我的应用程序,但是为了知道“我”(用户)是否被授权访问视图,唯一的方法似乎是查看视图本身并获取未授权页面。
有没有办法提前知道用户是否有权查看?这对于隐藏用户无权访问的链接很有用。
例如,在一个视图中,我想要一个类似的方法:
some_authorization_object.authorized_to_view('view_name')
或类似的东西。
先感谢您
解决方案
感谢回答者的帖子,我能够设计出最终解决方案。
最终解决方案的关键是 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)
用户有权访问的第一次出现表明用户有权查看该视图。
推荐阅读
- java - GLES20 更新 draw() 位图
- javascript - TypeError:targetItem.push 不是函数
- java - Andoid 7.0 上的 https 连接问题:SSLHandshakeException: Handshake failed
- php - 无法弄清楚为什么我的注销按钮不起作用(php)
- codenameone - codenameone android release build 显示带有 android.permission.READ_PHONE_STATE 的警告
- java - 基于java 8流中的前一个元素进行过滤
- python - 将视频从 raspberri pi 流式传输到互联网
- c - C 从第 x 行到第 y 行读取文件
- google-apps-script - 仅将 onEdit 脚本限制为 SourceSheet
- python - 当我在 Mac 应用程序上的应用程序本身所在的文件夹中创建一个文件时,该文件在哪里?