Несогласованное разрешение ACL для пирамиды / веб-сауны
Я устраняю неполадки
is_visible
на Websauna, так как он не работает должным образом (по крайней мере, для меня). Файл можно найти здесь.
Проблема в том, что контекст 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
который является копией resolve_principals но расширен моими собственными ACE, такими как
(Allow, "mygroup:admin", "add")
...
При чтении журнала в контексте, указанном выше, указан правильный acl, включая пользовательские ACE. Почему Pyramid ACL использует другой контекст при проверке разрешения в следующей строке? Что в данном случае возвращает 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:
Я использую:
Pyramid 1.10.4
Websauna 1.0a13
1 ответ
Я подозреваю, что websauna не вызывает вашу функцию, а использует ее по умолчанию.
resolve_principals
функция? Я думаю, довольно ясно, что руководители вмешались, когда
has_permission
вызываются не те из вашего
resolve_custom_principals
функции и, таким образом, что-то неправильно связано с этим переопределением.