Compare commits
2 Commits
safari-adm
...
policies-e
Author | SHA1 | Date | |
---|---|---|---|
ad9b5e98ba | |||
e4a21c824a |
@ -78,6 +78,7 @@ class PolicyBindingSerializer(ModelSerializer):
|
|||||||
"negate",
|
"negate",
|
||||||
"enabled",
|
"enabled",
|
||||||
"order",
|
"order",
|
||||||
|
"honor_order",
|
||||||
"timeout",
|
"timeout",
|
||||||
"failure_result",
|
"failure_result",
|
||||||
]
|
]
|
||||||
@ -110,7 +111,16 @@ class PolicyBindingFilter(FilterSet):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = PolicyBinding
|
model = PolicyBinding
|
||||||
fields = ["policy", "policy__isnull", "target", "target_in", "enabled", "order", "timeout"]
|
fields = [
|
||||||
|
"policy",
|
||||||
|
"policy__isnull",
|
||||||
|
"target",
|
||||||
|
"target_in",
|
||||||
|
"enabled",
|
||||||
|
"order",
|
||||||
|
"honor_order",
|
||||||
|
"timeout",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class PolicyBindingViewSet(UsedByMixin, ModelViewSet):
|
class PolicyBindingViewSet(UsedByMixin, ModelViewSet):
|
||||||
|
@ -0,0 +1,40 @@
|
|||||||
|
# Generated by Django 5.1.8 on 2025-04-17 15:13
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("authentik_core", "0047_delete_oldauthenticatedsession"),
|
||||||
|
("authentik_policies", "0011_policybinding_failure_result_and_more"),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddConstraint(
|
||||||
|
model_name="policybinding",
|
||||||
|
constraint=models.CheckConstraint(
|
||||||
|
condition=models.Q(
|
||||||
|
models.Q(
|
||||||
|
("policy_id__isnull", False),
|
||||||
|
("group_id__isnull", True),
|
||||||
|
("user_id__isnull", True),
|
||||||
|
),
|
||||||
|
models.Q(
|
||||||
|
("group_id__isnull", False),
|
||||||
|
("policy_id__isnull", True),
|
||||||
|
("user_id__isnull", True),
|
||||||
|
),
|
||||||
|
models.Q(
|
||||||
|
("user_id__isnull", False),
|
||||||
|
("policy_id__isnull", True),
|
||||||
|
("group_id__isnull", True),
|
||||||
|
),
|
||||||
|
_connector="OR",
|
||||||
|
),
|
||||||
|
name="authentik_policies_policybinding_only_one_type",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
@ -0,0 +1,20 @@
|
|||||||
|
# Generated by Django 5.1.8 on 2025-04-17 15:16
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("authentik_policies", "0012_policybinding_authentik_policies_policybinding_only_one_type"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="policybinding",
|
||||||
|
name="honor_order",
|
||||||
|
field=models.BooleanField(
|
||||||
|
default=False, help_text="Honor order when evaluating policies."
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
@ -3,6 +3,7 @@
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.db.models import Q
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from model_utils.managers import InheritanceManager
|
from model_utils.managers import InheritanceManager
|
||||||
from rest_framework.serializers import BaseSerializer
|
from rest_framework.serializers import BaseSerializer
|
||||||
@ -100,6 +101,10 @@ class PolicyBinding(SerializerModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
order = models.IntegerField()
|
order = models.IntegerField()
|
||||||
|
honor_order = models.BooleanField(
|
||||||
|
default=False,
|
||||||
|
help_text=_("Honor order when evaluating policies."),
|
||||||
|
)
|
||||||
|
|
||||||
def passes(self, request: PolicyRequest) -> PolicyResult:
|
def passes(self, request: PolicyRequest) -> PolicyResult:
|
||||||
"""Check if request passes this PolicyBinding, check policy, group or user"""
|
"""Check if request passes this PolicyBinding, check policy, group or user"""
|
||||||
@ -158,6 +163,28 @@ class PolicyBinding(SerializerModel):
|
|||||||
models.Index(fields=["user"]),
|
models.Index(fields=["user"]),
|
||||||
models.Index(fields=["target"]),
|
models.Index(fields=["target"]),
|
||||||
]
|
]
|
||||||
|
constraints = (
|
||||||
|
models.CheckConstraint(
|
||||||
|
condition=(
|
||||||
|
(
|
||||||
|
Q(policy_id__isnull=False)
|
||||||
|
& Q(group_id__isnull=True)
|
||||||
|
& Q(user_id__isnull=True)
|
||||||
|
)
|
||||||
|
| (
|
||||||
|
Q(group_id__isnull=False)
|
||||||
|
& Q(policy_id__isnull=True)
|
||||||
|
& Q(user_id__isnull=True)
|
||||||
|
)
|
||||||
|
| (
|
||||||
|
Q(user_id__isnull=False)
|
||||||
|
& Q(policy_id__isnull=True)
|
||||||
|
& Q(group_id__isnull=True)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
name="%(app_label)s_%(class)s_only_one_type",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Policy(SerializerModel, CreatedUpdatedModel):
|
class Policy(SerializerModel, CreatedUpdatedModel):
|
||||||
|
@ -5623,6 +5623,11 @@
|
|||||||
"maximum": 2147483647,
|
"maximum": 2147483647,
|
||||||
"title": "Order"
|
"title": "Order"
|
||||||
},
|
},
|
||||||
|
"honor_order": {
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Honor order",
|
||||||
|
"description": "Honor order when evaluating policies."
|
||||||
|
},
|
||||||
"timeout": {
|
"timeout": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"minimum": 0,
|
"minimum": 0,
|
||||||
|
16
schema.yml
16
schema.yml
@ -12092,6 +12092,10 @@ paths:
|
|||||||
name: enabled
|
name: enabled
|
||||||
schema:
|
schema:
|
||||||
type: boolean
|
type: boolean
|
||||||
|
- in: query
|
||||||
|
name: honor_order
|
||||||
|
schema:
|
||||||
|
type: boolean
|
||||||
- in: query
|
- in: query
|
||||||
name: order
|
name: order
|
||||||
schema:
|
schema:
|
||||||
@ -53311,6 +53315,9 @@ components:
|
|||||||
type: integer
|
type: integer
|
||||||
maximum: 2147483647
|
maximum: 2147483647
|
||||||
minimum: -2147483648
|
minimum: -2147483648
|
||||||
|
honor_order:
|
||||||
|
type: boolean
|
||||||
|
description: Honor order when evaluating policies.
|
||||||
timeout:
|
timeout:
|
||||||
type: integer
|
type: integer
|
||||||
maximum: 2147483647
|
maximum: 2147483647
|
||||||
@ -54880,6 +54887,9 @@ components:
|
|||||||
type: integer
|
type: integer
|
||||||
maximum: 2147483647
|
maximum: 2147483647
|
||||||
minimum: -2147483648
|
minimum: -2147483648
|
||||||
|
honor_order:
|
||||||
|
type: boolean
|
||||||
|
description: Honor order when evaluating policies.
|
||||||
timeout:
|
timeout:
|
||||||
type: integer
|
type: integer
|
||||||
maximum: 2147483647
|
maximum: 2147483647
|
||||||
@ -54922,6 +54932,9 @@ components:
|
|||||||
type: integer
|
type: integer
|
||||||
maximum: 2147483647
|
maximum: 2147483647
|
||||||
minimum: -2147483648
|
minimum: -2147483648
|
||||||
|
honor_order:
|
||||||
|
type: boolean
|
||||||
|
description: Honor order when evaluating policies.
|
||||||
timeout:
|
timeout:
|
||||||
type: integer
|
type: integer
|
||||||
maximum: 2147483647
|
maximum: 2147483647
|
||||||
@ -59183,6 +59196,9 @@ components:
|
|||||||
type: integer
|
type: integer
|
||||||
maximum: 2147483647
|
maximum: 2147483647
|
||||||
minimum: -2147483648
|
minimum: -2147483648
|
||||||
|
honor_order:
|
||||||
|
type: boolean
|
||||||
|
description: Honor order when evaluating policies.
|
||||||
timeout:
|
timeout:
|
||||||
type: integer
|
type: integer
|
||||||
maximum: 2147483647
|
maximum: 2147483647
|
||||||
|
@ -61,6 +61,7 @@ export class BoundPoliciesList extends Table<PolicyBinding> {
|
|||||||
new TableColumn(this.allowedTypesLabel),
|
new TableColumn(this.allowedTypesLabel),
|
||||||
new TableColumn(msg("Enabled"), "enabled"),
|
new TableColumn(msg("Enabled"), "enabled"),
|
||||||
new TableColumn(msg("Timeout"), "timeout"),
|
new TableColumn(msg("Timeout"), "timeout"),
|
||||||
|
new TableColumn(msg("Honor order"), "honor_order"),
|
||||||
new TableColumn(msg("Actions")),
|
new TableColumn(msg("Actions")),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -165,6 +166,7 @@ export class BoundPoliciesList extends Table<PolicyBinding> {
|
|||||||
html`${this.getPolicyUserGroupRow(item)}`,
|
html`${this.getPolicyUserGroupRow(item)}`,
|
||||||
html`<ak-status-label type="warning" ?good=${item.enabled}></ak-status-label>`,
|
html`<ak-status-label type="warning" ?good=${item.enabled}></ak-status-label>`,
|
||||||
html`${item.timeout}`,
|
html`${item.timeout}`,
|
||||||
|
html`<ak-status-label type="info" ?good=${item.honorOrder}></ak-status-label>`,
|
||||||
html` ${this.getObjectEditButton(item)}
|
html` ${this.getObjectEditButton(item)}
|
||||||
<ak-forms-modal size=${PFSize.Medium}>
|
<ak-forms-modal size=${PFSize.Medium}>
|
||||||
<span slot="submit"> ${msg("Update")} </span>
|
<span slot="submit"> ${msg("Update")} </span>
|
||||||
|
@ -310,6 +310,26 @@ export class PolicyBindingForm extends ModelForm<PolicyBinding, string> {
|
|||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</ak-form-element-horizontal>
|
</ak-form-element-horizontal>
|
||||||
|
<ak-form-element-horizontal name="honorOrder">
|
||||||
|
<label class="pf-c-switch">
|
||||||
|
<input
|
||||||
|
class="pf-c-switch__input"
|
||||||
|
type="checkbox"
|
||||||
|
?checked=${first(this.instance?.honorOrder, false)}
|
||||||
|
/>
|
||||||
|
<span class="pf-c-switch__toggle">
|
||||||
|
<span class="pf-c-switch__toggle-icon">
|
||||||
|
<i class="fas fa-check" aria-hidden="true"></i>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
<span class="pf-c-switch__label">${msg("Honor order")}</span>
|
||||||
|
</label>
|
||||||
|
<p class="pf-c-form__helper-text">
|
||||||
|
${msg(
|
||||||
|
"Honor the order of policies. Use if policies must be evaluated sequentially following the specified order. May impact performance.",
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
</ak-form-element-horizontal>
|
||||||
<ak-form-element-horizontal label=${msg("Timeout")} ?required=${true} name="timeout">
|
<ak-form-element-horizontal label=${msg("Timeout")} ?required=${true} name="timeout">
|
||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
|
Reference in New Issue
Block a user