Rol ve İzin Tabanlı Erişim Kontrolü


44

Erişim kontrolü (yetkilendirme) söz konusu olduğunda, roller ve izinler arasındaki içsel değişmeyi anlamaya çalışıyorum.

Bir verilenle başlayalım: Sistemimizde, bir İzin iyi ayarlanmış bir erişim birimi olacaktır (" Kaynak X'i Düzenle ", " Gösterge tablosu sayfasına eriş ", vb.). Bir Rol 1+ İzinler topluluğu olacaktır. Bir kullanıcının 1+ Rolü olabilir. Tüm bu ilişkiler (Kullanıcılar, Roller, İzinler) hepsi bir veritabanında saklanır ve anında ve gerektiğinde değiştirilebilir.

Endişelerim:

(1) Erişim kontrolü için Roller kontrolünde bu kadar "kötü" olan nedir? Bunun yerine izinleri kontrol ederek ne gibi faydalar elde edilir? Başka bir deyişle, aşağıdaki iki snippet arasındaki fark nedir:

if(SecurityUtils.hasRole(user)) {
    // Grant them access to a feature
}

// vs.
if(SecurityUtils.hasPermission(user)) {
    // Grant them access to a feature
}

Ve:

(2) Bu senaryoda, Roller ne gibi faydalı değerler sağlar? Doğrudan Kullanıcılara 1+ İzin atayamaz mıyız? Rollerin hangi somut değerlerini sunarlar (birisi belirli örnekler verebilir)?


2
Birkaç nokta: (1) tek bir kullanıcının birden fazla rolü olabilir, (2) ACL'ye (Erişim Kontrol Listeleri) bakmak isteyebilirsiniz, örn. Yalnızca bir pano sayfası alt grubuna "pano sayfasına erişme" yetkisi vermek isteyebilirsiniz (birkaç tane varsa).
Matthieu M.

Yanıtlar:


62

(1) Erişim kontrolü için Roller kontrolünde bu kadar "kötü" olan nedir? Bunun yerine izinleri kontrol ederek ne gibi faydalar elde edilir?

Kontrol anında, arama kodunun yalnızca "X kullanıcısı Y eylemini gerçekleştirme iznine sahip mi?" .
Çağıran kod, roller ve izinler arasındaki ilişkileri önemsemez ve farkında olmamalıdır.

Yetkilendirme katmanı daha sonra kullanıcının bu iznin olup olmadığını kontrol ederek kullanıcının bu izne sahip olup olmadığını kontrol eder. Bu, arama kodunu güncellemeden yetkilendirme mantığını değiştirmenize olanak sağlar.

Çağrı sitesindeki rolü doğrudan kontrol ediyorsanız, endişelerin ayrılmasını ihlal eden dolaylı olarak rol-izin ilişkileri oluşturuyor ve arama koduna yetkilendirme mantığı enjekte ediyorsunuz.

Daha sonra bu rolün fooizninin olmaması gerektiğine karar verirseniz baz, kullanıcının a olup olmadığını denetleyen her kodu değiştirmeniz gerekir foo.

(2) Bu senaryoda, Roller ne gibi faydalı değerler sağlar? Doğrudan Kullanıcılara 1+ İzin atayamaz mıyız? Rollerin hangi somut değerlerini sunarlar (birisi belirli örnekler verebilir)?

Roller kavramsal olarak adlandırılmış bir izinler koleksiyonunu temsil eder.

Bir kullanıcının belirli ayarları düzenlemesine olanak sağlayan yeni bir özellik eklediğinizi varsayalım. Bu özellik sadece yöneticiler için mevcut olmalıdır.

Kullanıcı başına izinleri saklıyorsanız, veritabanınızda bir şekilde yönetici olduğunu bildiğiniz tüm kullanıcıları bulmanız gerekir (Kullanıcılar için rol bilgisi saklamazsanız, hangi kullanıcıların yönetici olduğunu nasıl bilebilirsiniz?) Ve ekleme bu izin izin listelerine aittir.

Rolleri kullanırsanız, yalnızca izlemenin iznini eklemeniz gerekir Administrator; bu, hem gerçekleştirilmesi daha kolay, hem de daha fazla alan verimlidir ve hatalara daha az eğilimlidir.


Ah? Yetkilendirme katmanı kullanıcı iddia ettiği kişi o olup olmadığını kontrol edecektir; hangi fonksiyonların / verilerin böyle bir kullanıcının erişimini sağlayabildiğini kontrol eden katman yetkilendirme katmanıdır
SJuan76

4
Bu, tüm programcılar için zorunlu okuma olmalıdır. Mükemmel.
Kosta Kontos

2
Basit, özlü ve şu ana kadar - bir kitabın bütün bölümünü bir yerde atıyor. Teşekkürler.
Dan Nissenbaum

2
Netlik için yorum yapın (ve eğer hatalıysam, lütfen beni düzeltin): Bir authorization layerolasılık , işlev tanımının (yani) user->hasPermission(SOME_PERMISSION)önce kullanıcının rollerini dahili olarak kontrol etmekten sonra verilen rollerden herhangi birinin verilen / dahil edip etmediğini kontrol etmekten başka bir şey ifade etmez. izni. Örneğin, the calling codebelirli bir sayfa kullanıcı için görülebilir ve çağırır olmadığını görmek için kontrol edilebilir user->hasPermission(VIEW_GIVEN_PAGE)ve authorization layeroluşan tanımı içinde hasPermissionyukarıdaki gibi rolleri denetler fonksiyonu.
Dan Nissenbaum

1
@DanNissenbaum Evet, doğru anlamışsınız gibi sesler, kullanıcıların rolü bu yetkiye sahip olup olmadığını kontrol etmek kadar basit olabilir. Bundan daha fazlası da olabilir. Örneğin, belki de bir kullanıcıyı geçici olarak askıya alma seçeneğiniz vardır ve bu durumda hasPermissionkontrol edebilir usersRole.HasPermission(VIEW_GIVEN_PAGE) && !user.Suspended. Mesele şu ki, hepsi tek bir yerde ve alıcı (çağıran) kodunda değil.
Rotem

18

İlk sorunuza cevaben, bir kullanıcının belirli bir izinden ziyade bir rolü olduğunu kontrol etmedeki en büyük sorun, izinlerin birden fazla rol üstlenebileceğidir. Buna bir örnek olarak, bir geliştirici, muhtemelen menajerleri tarafından tutulan bir izin olan şirket intranetindeki geliştirici portalını görmeye erişebilir. Bir kullanıcı geliştirici portalına erişmeye çalışıyorsa, şuna benzer bir çekiniz olur:

if(SecurityUtils.hasRole(developer)) {
    // Grant them access to a feature
} else if(SecurityUtils.hasRole(manager)) {
    // Grant them access to a feature
} else if...

( switchSeçtiğiniz dilde bir ifade daha iyi olurdu, ama yine de düzenli değil)

Bir izin ne kadar yaygın veya yaygınsa, belirli bir sisteme erişebildiğinden emin olmak için kontrol etmeniz gereken kullanıcı rolleri o kadar fazladır. Bu aynı zamanda, bir rol için izinleri her değiştirdiğinizde, bunu yansıtmak için çeki değiştirmek zorunda kalacağınız sorununa yol açacaktır. Büyük bir sistemde bu çok çabuk hantallaşacaktır.

Kullanıcının, örneğin geliştirici portalına erişmesine izin veren izni olup olmadığını kontrol ederseniz, hangi rolde oldukları önemli değildir, erişim izni verilir.

İkinci sorunuzu yanıtlamak için, rolünüzün nedeni, izinlerin "paketlerini" değiştirmek ve dağıtmak kadar kolay davranmalarıdır. Yüzlerce rol ve binlerce izne sahip bir sisteminiz varsa, yeni bir kullanıcı eklemek (örneğin yeni bir İK yöneticisi) geçmenizi ve diğer İK yöneticilerinin sahip olduğu her bir izni vermenizi gerektirir. Bu sadece sıkıcı olmaz, aynı zamanda manuel olarak yapılırsa hatalara açıktır. Bunu sadece bir kullanıcının profiline "İK yöneticisi" rolünü eklemekle karşılaştırın; bu, onlara bu roldeki diğer tüm kullanıcılarla aynı erişimi verecektir.

Varolan bir kullanıcıyı (sisteminiz destekliyorsa) basitçe klonlayabileceğinizi iddia edebilir, ancak bu, kullanıcıya o an için doğru izinleri verirken, gelecekte tüm kullanıcılar için bir izin eklemeye veya kaldırmaya çalışıyor olabilir. zor. Bunun için örnek bir senaryo, belki geçmişte İK personelinin de bordrodan sorumlu olmasıydı, ancak daha sonra şirket, özellikle maaş bordrosunu idare etmek için personel istihdam edecek kadar büyür. Bu, İK'nın artık bordro sistemine erişmesi gerekmediği için izinlerin kaldırılması anlamına geliyor. 10 farklı İK üyeniz varsa, el ile geçmeniz ve kullanıcı hatası olasılığını ortaya çıkaran doğru izni kaldırdığınızdan emin olmanız gerekir. Bununla ilgili diğer sorun, basitçe ölçeklememesidir; Belirli bir rolde gittikçe daha fazla kullanıcı kazandıkça, rol değişikliği çok daha zorlaşır. Bunu, bu rolü taşıyan her kullanıcı tarafından yansıtılacak olan izni kaldırmak için söz konusu genel rolünü değiştirmeniz gereken rolleri kullanmakla karşılaştırın.


iyi bir örnek, teşekkürler!
frank
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.