我正在对Websauna上的is_visible方法进行故障排除,因为它不能正常工作(至少对我来说是这样)。该文件可以找到这里。
问题是,看起来ACL上下文突然与上面显示的一行发生了变化。下面是带有打印日志的方法。
def is_visible(self, context: Resource, request: Request) -> bool:
"""Determine if we should render this button.
:param context: Traversal context
:param request: Current HTTP Request.
:returns: Boolean indicating if button is visible or not.
"""
visible = True
if self.permission is not None:
print(context, '&' , self.permission)
print('******CONTEXT & PERMISSION')
print(context.__acl__)
print('******+++++++CONTEXT ACL')
print(request.has_permission(self.permission, context))
print('-------------HAS PERMISSION EVAL')
if not request.has_permission(self.permission, context):
visible = False
if self.feature is not None:
if self.feature not in request.registry.features:
visible = False
return visible下面的日志显示了context在拒绝访问时如何显示与has_permission()引用的值不同的值。
下面日志中的前两行显示了对resolve_custom_principals的调用,这是校长的一个副本,但是用我自己的ACE(如(Allow, "mygroup:admin", "add"))进行了扩展.
读取日志时,上面一行的上下文具有正确的acl,包括自定义ACEs。为什么在下一行检查权限时使用不同的上下文?在本例中,它返回ACLDenied。
[11:13:01] [websauna.myaddon.auth.principals resolve_custom_principals] ['system.Authenticated', 'user:74', 'mygroup:admin', 'mygroup:manager', 'team_member:1']
[11:13:01] [websauna.myaddon.auth.principals resolve_custom_principals] ['system.Authenticated', 'user:74', 'mygroup:admin', 'mygroup:manager', 'team_member:1']
<websauna.myaddon.crud.org.OrgResource object at 0x7fa021f883c8> & add
******CONTEXT & PERMISSION
[('Allow', 'mygroup:admin', 'add'), ('Allow', 'mygroup:manager', 'add'), ('Allow', 'mygroup:senior', 'add'), ('Allow', 'mygroup:assistant', 'add'), ('Deny', 'mygroup:legcle', 'add'), ('Deny', 'mygroup:clerk', 'add'), ('Deny', 'mygroup:intern', 'add'), ('Allow', 'mygroup:admin', 'edit'), ('Allow', 'mygroup:manager', 'edit')]
******+++++++CONTEXT ACL
ACLDenied permission 'add' via ACE '<default deny>' in ACL [('Allow', 'system.Authenticated', 'authenticated'), ('Allow', 'superuser:superuser', 'shell'), ('Allow', 'system.Everyone', 'view')] on context <websauna.myaddon.crud.org.OrgResource object at 0x7fa021f883c8> for principals ['system.Everyone', 'system.Authenticated', 74, 'system.Authenticated', 'user:74']
-------------HAS PERMISSION EVAL
<websauna.myaddon.crud.org.OrgResource object at 0x7fa021f883c8> & add
******CONTEXT & PERMISSION
[('Allow', 'mygroup:admin', 'add'), ('Allow', 'mygroup:manager', 'add'), ('Allow', 'mygroup:senior', 'add'), ('Allow', 'mygroup:assistant', 'add'), ('Deny', 'mygroup:legcle', 'add'), ('Deny', 'mygroup:clerk', 'add'), ('Deny', 'mygroup:intern', 'add'), ('Allow', 'mygroup:admin', 'edit'), ('Allow', 'mygroup:manager', 'edit')]
******+++++++CONTEXT ACL
ACLDenied permission 'add' via ACE '<default deny>' in ACL [('Allow', 'system.Authenticated', 'authenticated'), ('Allow', 'superuser:superuser', 'shell'), ('Allow', 'system.Everyone', 'view')] on context <websauna.myaddon.crud.org.OrgResource object at 0x7fa021f883c8> for principals ['system.Everyone', 'system.Authenticated', 74, 'system.Authenticated', 'user:74']
-------------HAS PERMISSION EVAL
[11:13:01] [websauna.system.core.session create_session] Skipped session creation for http://localhost:6543/websauna-static/bootstrap.min.css如果你需要更多的信息,或者我如何使问题更清楚,请告诉我。
更新1:视图模板中调用is_visible函数以确定要呈现哪个按钮。在我的例子中,它没有显示按钮,但是在上下文中设置了权限。
<div id="crud-page-buttons" class="header-resources">
{% for button in resource_buttons %}
{% if button.is_visible(context, request) %}
{{ button.render(context, request)|safe }}
{% endif %}
{% endfor %}
</div>更新2:
我在用:
金字塔1.10.4
网上桑拿1.0a13
发布于 2020-12-10 19:50:22
我怀疑websauna不是在调用您的resolve_custom_principals函数,而是在使用它的默认resolve_principals函数?我认为很明显,在调用has_permission时引入的主体不是来自您的resolve_custom_principals函数的主体,因此有些东西没有与此覆盖正确地连接起来。
https://stackoverflow.com/questions/64506344
复制相似问题