Öznitelik tabanlı erişim denetimi politikası (AuthAbacPolicy, "ABAC politikası") tek bir izin koduna koşullar ekler. Kodu taşıyan bir kullanıcı o kodun her etkin politikasını da sağlamalıdır. Politikalar bir yöneticinin auth ayarlarında düzenlediği kayıtlardır; değerlendirici modules/auth/guards.py içinde, kayıtlar modules/auth/policies/ içindedir. Rollerin ve izin kodlarının kendisi roller ve izinler sayfasında açıklanır.
Kısaca¶
- Bir politika tek bir
permission_codekoduna aittir ve{"logic": "all" veya "any", "rules": [...]}biçiminde birconditionsaklar (src/cluster_erp/modules/auth/policies/models.py:12-55,src/cluster_erp/modules/auth/policies/schemas.py:76-90). - Bir kuralın bir
subjectöznitelik yolu, biroperatorve sabit değer ya da başka bir öznitelik yolu olan birtargetdeğeri vardır (src/cluster_erp/modules/auth/guards.py:325-334). - On işleç vardır:
eq,neq,in,not_in,gt,gte,lt,lte,contains,between(src/cluster_erp/modules/auth/policies/schemas.py:11-13,src/cluster_erp/modules/auth/guards.py:394-438). - Bir kodun tüm etkin politikaları geçmelidir; her politika kendi kurallarını kendi
logicdeğerine göre birleştirir (src/cluster_erp/modules/auth/guards.py:259-281,src/cluster_erp/modules/auth/guards.py:306-322). - Politikası olmayan bir koda izin verilir;
abac_strict_permission_codesayarında listelenmişse verilmez (src/cluster_erp/modules/auth/guards.py:215-236,src/cluster_erp/config/settings.py:339).
Nasıl çalışır¶
Öznitelikler¶
_resolve_attribute bir yolu ilk noktadan bir kapsam ve bir alana böler (src/cluster_erp/modules/auth/guards.py:337-369):
| Kapsam | Alanlar | Kaynak |
|---|---|---|
user |
Yalnızca izin listesindeki id, username, email, first_name, last_name, employee_id, party_id, is_active, department, clearance, title, location adları; başka her ad boş çözülür |
src/cluster_erp/modules/auth/guards.py:41-61, src/cluster_erp/modules/auth/guards.py:351-356 |
resource |
Çağıranın yüklenmiş bir varlık için verdiği öznitelik sözlüğünün herhangi bir anahtarı | src/cluster_erp/modules/auth/guards.py:357-358 |
env |
current_time (HH:MM:SS, UTC) ve current_date (YYYY-MM-DD, UTC) |
src/cluster_erp/modules/auth/guards.py:359-367 |
department, clearance, title ve location adları AuthUser sütunu değildir; yorum bunları insan kaynaklarından gelecek özne öznitelikleri için ileriye dönük yuvalar olarak adlandırır ve bugün boş çözülürler (src/cluster_erp/modules/auth/guards.py:41-45, src/cluster_erp/modules/auth/users/models.py:17-91).
İşleçler¶
| İşleç | Anlam | Eksik veya hatalı girdi | Kaynak |
|---|---|---|---|
eq, neq |
Dizge eşitliği veya eşitsizliği | Yanlış | src/cluster_erp/modules/auth/guards.py:395-402 |
in, not_in |
Liste hedefte üyelik | Hedef liste değilse yanlış | src/cluster_erp/modules/auth/guards.py:403-412 |
gt, gte, lt, lte |
Önce sayı, sonra ISO saat, sonra ISO tarih sıralaması | Çift karşılaştırılamıyorsa yanlış | src/cluster_erp/modules/auth/guards.py:372-391, src/cluster_erp/modules/auth/guards.py:413-424 |
contains |
Dizge öznenin alt dizgesi | Dizge değilse yanlış | src/cluster_erp/modules/auth/guards.py:425-428 |
between |
İki öğeli liste olarak verilen kapalı aralık | Aksi hâlde yanlış | src/cluster_erp/modules/auth/guards.py:429-436 |
| başka her değer | yok | Yanlış | src/cluster_erp/modules/auth/guards.py:438 |
Politikaların değerlendirildiği yerler¶
Akış şeması iki değerlendirme noktasını gösterir.
flowchart TD
guard["require_permission"] --> route_eval["check_abac, resource None"]
route_eval --> skip["resource.* kuralları atlanır"]
skip --> userenv["user.* ve env.* kuralları karara bağlanır"]
userenv --> handler["uç işleyicisi varlığı yükler"]
handler --> wired{"kod RESOURCE_ENFORCED_CODES içinde mi?"}
wired -->|evet| post["varlık öznitelikleriyle enforce_abac"]
wired -->|hayır| done["ikinci değerlendirme yok"]
post --> doneDüz anlatımla:
- Uç bekçisi
check_abacfonksiyonunuresource=Noneile çağırır. Birresource.*özniteliği adlandıran kurallar bu noktada dışarıda kalır;user.*veenv.*kuralları karara bağlanır (src/cluster_erp/modules/auth/guards.py:225-236,src/cluster_erp/modules/auth/guards.py:306-322). - Varlığı yükledikten sonra bir servis varlığın öznitelikleriyle
enforce_abacçağırır; böyleceresource.*kuralları da karara bağlanır (src/cluster_erp/modules/auth/guards.py:284-303). - Yalnızca
RESOURCE_ENFORCED_CODESiçindeki kodlar bu ikinci adıma bağlıdır. Bu commit'te küme tek bir kod tutar:intranet_official_delivery.read; çağıranısrc/cluster_erp/modules/intranet/delivery/routes.py:38olur (src/cluster_erp/modules/auth/guards.py:29-39). PolicyServicebaşka her kod içinresource.*kuralı saklamayı yaratmada ve güncellemedeABAC_RESOURCE_RULES_UNSUPPORTEDkoduyla HTTP 422 vererek reddeder (src/cluster_erp/modules/auth/policies/services.py:64-88,src/cluster_erp/modules/auth/policies/services.py:90-131).
Politika saklama¶
Politika formu bir mantık seçicisini ve kural satırları listesini düzenler. _assemble_condition bunları condition içine katlar, _clean_rules eksik satırları atar: öznesi olmayan, işleci bilinmeyen, hedefi boş olan veya hedefi boş olmayan bir listeye dönüşemeyen liste işleçli satırlar (src/cluster_erp/modules/auth/policies/schemas.py:44-90). in, not_in veya between için düz bir dizge hedef, bir JSON dizisinden veya virgülle ayrılmış değerlerden listeye çevrilir (src/cluster_erp/modules/auth/policies/schemas.py:20-41). Bir güncelleme form alanlarını saklı koşulla birleştirir; böylece kısmi bir güncelleme diğer yarıyı silmez (src/cluster_erp/modules/auth/policies/services.py:97-131).
PolicyCreate üzerinden kurulmuş örnek istek gövdesi (src/cluster_erp/modules/auth/policies/schemas.py:93-104):
{
"code": "<policy_code>",
"permission_code": "<resource>.<action>",
"name": "<policy name>",
"condition_logic": "all",
"condition_rules": [
{"subject": "env.current_time", "operator": "between", "target": ["09:00", "18:00"]}
],
"is_active": true
}
Uçlar¶
| Uç | İzin | Kaynak |
|---|---|---|
GET /api/v1/auth/policies/ |
abac_policy.read |
src/cluster_erp/modules/auth/policies/routes.py:18-27 |
POST /api/v1/auth/policies/ |
abac_policy.create |
src/cluster_erp/modules/auth/policies/routes.py:30-38 |
GET /api/v1/auth/policies/{policy_id} |
abac_policy.read |
src/cluster_erp/modules/auth/policies/routes.py:41-51 |
PUT /api/v1/auth/policies/{policy_id} |
abac_policy.update |
src/cluster_erp/modules/auth/policies/routes.py:54-65 |
DELETE /api/v1/auth/policies/{policy_id} |
abac_policy.delete |
src/cluster_erp/modules/auth/policies/routes.py:68-76 |
POST /api/v1/auth/policies/bulk-delete |
abac_policy.delete |
src/cluster_erp/modules/auth/policies/routes.py:79-87 |
Silme deleted_at basar (src/cluster_erp/modules/auth/policies/services.py:133-139). Web ekranı auth ayar sekmelerindeki ABAC Politikası varlığıdır (abac_policy) (src/cluster_erp/modules/auth/module.py:266-275, src/cluster_erp/modules/auth/policies/metadata.py:35).
Neden böyle kurulmuştur¶
- Kaynak kuralları uç bekçisinde atlanır, çünkü orada yüklü varlık yoktur; boş bir sözlüğe karşı değerlendirilseler tüm ucu reddederlerdi (
src/cluster_erp/modules/auth/guards.py:254-257). - Bağlı olmayan kodlar için kaynak kuralı reddedilir, çünkü politika hiçbir şey uygulamadan yapılandırılmış gibi görünürdü (
src/cluster_erp/modules/auth/guards.py:29-34,src/cluster_erp/modules/auth/policies/services.py:68-71). - Kullanıcı özniteliği izin listesi koşul dilini parola özeti gibi hassas sütunlardan uzak tutar (
src/cluster_erp/modules/auth/guards.py:41-45). - Eksik kural satırları atılır, çünkü boş bir kural
allaltında sessizce reddeder veyanot_inaltında izin verirdi (src/cluster_erp/modules/auth/policies/schemas.py:45-50).
Kurallar ve sınırlar¶
- Politikalar izin kodlarıyla birlikte veritabanı başına önbelleğe alınır ve her politika yazımında düşürülür; bkz. kimlik doğrulama ve oturumlar sayfasındaki İzin belleği bölümü (
src/cluster_erp/modules/auth/auth_cache.py:113-135). - Bellek ORM satırı değil, bağımsız bir
PolicyRuleanlık görüntüsü tutar (src/cluster_erp/modules/auth/auth_cache.py:28-38). - Değerlendiriciyi sabitleyen testler:
tests/test_abac_evaluator.py(17 test),tests/test_abac_enforcement.py(9),tests/test_abac_policy_condition.py(5);grep -c "def test_"ile sayıldı. Uçtan uca süitweb-client/_e2e_abac_policy_crud.mjsdosyasıdır.
Diğer parçalarla etkileşim¶
- Intranet resmi tebligat ucu, yükleme sonrası tek çağırandır (
src/cluster_erp/modules/intranet/delivery/routes.py:38). Bkz. intranet erişimi, hedef kitle ve saklama. - Kişisel kayıtlar için satır düzeyinde kapsam ayrı bir mekanizmadır; bkz. alan ve satır erişimi.
Sınırlar ve açık noktalar¶
- Ortam öznitelikleri yalnızca UTC'dir; kiracı veya kullanıcı başına saat dilimi koddan belirlenemedi (
src/cluster_erp/modules/auth/guards.py:362-366). department,clearance,titlevelocationdeğerlerinin kaynağı koddan belirlenemedi; bunlarAuthUsersütunu değildir.
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| ABAC policy | AuthAbacPolicy |
Bir izin kodunu taşıyanın ayrıca sağlaması gereken kural koşullarının kaydı. | ABAC politikası | src/cluster_erp/modules/auth/policies/models.py:12 |
| policy rule | _evaluate_rule |
Bir politika koşulundaki tek bir özne, işleç ve hedef karşılaştırması. | politika kuralı | src/cluster_erp/modules/auth/guards.py:325 |
| strict permission code | abac_strict_permission_codes |
Politikası yoksa reddedilen kod. | katı izin kodu | src/cluster_erp/config/settings.py:339 |
| resource-enforced code | RESOURCE_ENFORCED_CODES |
Servisinin varlığı yükledikten sonra kaynak kurallarını değerlendirdiği kod. | kaynakta uygulanan kod | src/cluster_erp/modules/auth/guards.py:35 |
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.