Aşağıdaki veritabanı yapısını varsayalım (gerekirse değiştirilebilir) ...
Belirli bir sayfada belirli bir kullanıcı için "etkili izinleri" belirlemek için beni Sayfa ve etkin izinleri içeren bir satır döndürmek sağlayacak şekilde belirlemek için güzel bir yol arıyorum.
İdeal çözüm geçerli kullanıcı için belirli bir sayfa satırı için "etkili izinleri" değerlendirmek için gerekli özyineleme gerçekleştirmek için bir CTE kullanan bir işlev içerebilir düşünüyorum.
Arka Plan ve Uygulama ayrıntıları
Yukarıdaki şema, kullanıcılara rol ekleyerek ve rollerinden çıkarılarak izin verilebilecekleri içerik yönetim sistemi için bir başlangıç noktasını temsil eder.
Sistemdeki kaynaklar (örneğin sayfalar), o role bağlı kullanıcı grubuna verdiği izinleri vermek için rollerle ilişkilendirilir.
Fikir, tüm rolü reddetmek ve ağaçtaki kök düzeyi sayfasını bu role ekleyip kullanıcıyı bu role ekleyerek bir kullanıcıyı kolayca kilitleyebilmektir.
Bu, (örneğin) şirket için çalışan bir yüklenici uzun süre boyunca mevcut olmadığında izin yapısının yerinde kalmasına izin verir, bu da kullanıcıyı tek bir rolden kaldırarak orijinal izinlerinin aynı şekilde verilmesine izin verir. .
İzinler, bu kurallara uyarak dosya sistemine uygulanabilecek tipik ACL türü kurallara dayanır.
CRUD izinleri nulllable bitler olmalıdır, böylece mevcut değerler true, false, aşağıdakilerin doğru olduğu yerde tanımlanmamıştır:
- yanlış + bir şey = yanlış
- true + tanımlı değil = true
- true + true = doğru
- tanımlı değil + tanımlı değil = tanımlı değil
İzinlerden herhangi biri yanlışsa -> yanlış Başka varsa doğru -> doğru Başka (tümü tanımlanmadı) -> yanlış
Diğer bir deyişle, rol üyeliği yoluyla onlara izin verilmedikçe ve bir reddetme kuralı bir izin verme kuralını geçersiz kılmadığı sürece hiçbir şey için izin almazsınız.
Bunun geçerli olduğu izinlerin "kümesi", geçerli sayfaya kadar ve geçerli sayfaya dahil olmak üzere ağaca uygulanan tüm izinlerdir, başka bir deyişle: Bu sayfadaki ağaçtaki herhangi bir sayfaya uygulanan herhangi bir rolde yanlışsa sonuç yanlıştır , ancak buraya kadar tüm ağaç tanımlanmamışsa geçerli sayfa gerçek bir kural içeriyorsa, sonuç burada doğrudur ancak üst öğe için yanlış olur.
Mümkünse db yapısını gevşek bir şekilde tutmak istiyorum, ayrıca buradaki select * from pages where effective permissions (read = true) and user = ?
amacımın aşağıdaki gibi bir şey yapabilmek olduğunu unutmayın: bu yüzden herhangi bir çözüm, içinde etkili izinleri olan bir sorgulanabilir sete izin verebilmem gerekir. bir şekilde (kriterler belirtilebildiği sürece bunları iade etmek isteğe bağlıdır).
1 sayfanın diğerinin alt öğesi, 2 yönetici kullanıcı ve 1 salt okunur kullanıcılar için 2 sayfa bulunduğunu varsayarsak, her ikisi de yalnızca beklenen çıktı olarak böyle bir şey görmeyi beklediğim kök düzey sayfasına bağlıdır:
Admin user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, True , True, True , True
2, 1, Child,True , True, True , True
Read only user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, False , True, False , False
2, 1, Child,False , True, False , False
Bu soru hakkında daha fazla tartışma buradan başlayarak ana site sohbet odasında bulunabilir .