İzin, katmanlı bir mimaride nereye uyar?


24

Genellikle, yetkilendirme kararlarını sunucu tarafı denetleyicilerime yerleştiririm. Bunlar son zamanlarda RESTful son noktalar oldu, ancak aynı şeyin MVC tipi mimariler için de geçerli olduğunu düşünüyorum. Argüman uğruna, rol tabanlı yetkilendirme olduğunu varsayalım. Korumalı bir yöntem açıklamalı olacak veya kontroller yapacak ve gerekirse 403'leri geri gönderecektir.

Şimdi, yetkilendirmenin aslında bir iş kuralı olduğu düşünülürse - “sadece yöneticiler X'i listeleyebilir”, örneğin, bir katmana itilmeleri gerektiğini düşünüyorum. Bir denetleyici iş katmanını işlemi gerçekleştirmesini istediğinde, hizmet veya iş katmanı denetleyiciye yetkili olmadığını bildirir.

Bu makul bir yaklaşım mı? Bunun dezavantajları var mı?

Bunu yapmak için temelde bir sürü statik prosedür kodlanmış kuralını tutan bir Yetkilendirme Hizmetine sahip olmaktan nefret ediyorum ama belki de tüm erişim mantığını bir yerde tutmak mantıklı geliyor. Ayrı tutulması gereken bir kesişme endişesi midir?

Bu yüzden, birisinin bunu yapıp yapmadığını ve nasıl temiz bir şekilde başardıklarını veya okuyabildiğim iyi kaynaklar olup olmadığını soruyorum. Java fwiw kullanıyorum ama bu bir dil agnostik soru.

İlgili soruları burada kontrol ettim ve çok zayıflar ve cevapları çok iyi. Örneğin: Etki Alanı Modellerinde Doğrulama ve Yetkilendirme ve Servis Katmanı ile MVC'ye Taşımak

Kesişen bir endişe olduğu için bazı iyi argümanlar yapan bahar güvenlik belgelerini okuyorum , ancak bunun sadece "bahar yolu" olduğundan ve daha geniş bakış açılarıyla ilgilendiğinden endişeleniyorum. Ayrıca, başvurunuzu belirli bir çerçeveye bağlar.


1
Durum 403 yetkilendirme problemlerinde yanlıştır. Kullanın 401.
gnasher729

@ gnasher729 Ben bunun geriye doğru olduğunu düşünüyorum. 401, kimlik doğrulamanın başarısız olduğu veya sağlanmadığı anlamına gelir, 403 erişim haklarına sahip olmadığınız anlamına gelir: stackoverflow.com/questions/3297048/…
JimmyJames

@JimmyJames, otomatik araçların iş mantığını kolay bir şekilde çıkarmasına izin vermediğinden tüm kimlik doğrulama ve yetkilendirme başarısızlıklarında yalnızca bir tanesini kullanmanız gerektiğini düşündüğünüz başka bir okul daha var. Biraz yol var.
Berin Loritsch

1
@BerinLoritsch Üzgünüz, fikrin bir kimlik doğrulama veya yetkilendirme sorunu olup olmadığını anlamayı zorlaştırdığını mı söylüyorsunuz? RFC oldukça açık görünüyor, ancak çok fazla bilgi göstermek istemiyorsanız 403 yerine 404 kullanabileceğinizi belirtiyor. 403 yerine 401 kullanmak için argüman için sağlayabileceğiniz bir referans var mı?
JimmyJames

@JimmyJames, Evet. Bu düşünce süreci güvenlik uzmanlarından geliyor, geliştiricilerden değil. Ayrıca, kaynağın bile var olduğunu gizlemek için bilgileri tamamen gizlemek için 404 önerinizi gördüm.
Berin Loritsch

Yanıtlar:


9

Yalnızca kullanıcının yetkili olduğu seçenekleri ortaya koymak iyi bir uygulamadır.

Bu, yetkilendirmeyi çapraz kesilen bir endişe olmaya zorlar. "Görünüm", kullanıcının seçenekleri ve menüleri görüntüleyebilmesi için ne yapmasına izin verildiğini bilmelidir.

Arka uç, güvenlik kararları almak için ön uca güvenmemeli, bu nedenle yetkilendirmenin kendisini kontrol etmelidir.

Verilere bağlı olarak yetkilendirmeyi etkileyen iş kuralları olabilir; örneğin, "Yalnızca 5000 dolardan fazla bakiyesi olan kullanıcılar yabancı para transferini teşvik edebilir" veya "Yalnızca Genel Müdürlük'te bulunan bir kullanıcı bu hesapları görebilir". Bu yüzden iş mantığı içerisinde bir miktar yetkilendirme mantığı gerekir.

Ayrıca göz önünde bulundurulması gereken teknik yetkiler de vardır - kayıtları kim görebilir, veritabanını kim yedekleyebilir / geri yükleyebilir?

Bu nedenle, nihayetinde, her bir bileşeninizin bazı özel güvenlik ve / veya yetkilendirme gereklilikleri olabilir, pratikte bunu ayrı bir "yetkilendirme katmanına" koymak neredeyse imkansızdır.


7

Servis katmanınızda gravür yetkilendirmesine kesinlikle makul bir yaklaşım olduğunu düşünüyorum. Hizmetinizi yetkisiz etkinlikler gerçekleştirmekten korumanız gerekir (özellikle veri değişiklikleri). Servis katmanınız tek bir kütüphanede bulunabilir ve farklı Sunum katmanları tarafından kullanılıyor olabilir (aynı Servis katmanını kullanan farklı UI uygulamalarınız olabilir). Ayrıca, belirli Sunum katmanlarının gerekli doğrulamaları gerçekleştirdiğine güvenemezsiniz. Servis katmanınızı ayrı bir sürece taşımaya karar verirseniz bu özellikle önemlidir (örneğin, SOA yaklaşımını takip ederek).

Şimdi bunun "temiz bir şekilde" nasıl başarılacağı hakkında. İş mantığını yetki kontrolleriyle doldurma fikrinden hoşlanmıyorum, bu nedenle en-boy yönelimli-programlama-yaklaşımın özel olarak uygulanması yardımcı olabilir: hizmet metotlarını özel niteliklerle dekore etmek veya müdahalelerle dinamik proxy'ler kullanmak olabilir.

Ve önemlisi, çok basit projelerde, yalnızca hayatınızı kolaylaştırmak için ayrı onaylar almadan yaşayabileceğinizi itiraf etmeliyim. Ancak “basit proje” nin “karmaşık proje” olmaya başladığı anı kaçırmayın.


7

Yetki kontrollerini gidebildikleri kadar alçaltmayı seviyorum! (Ama daha fazla değil!)

Bunu "üstte" olan katmanlara karşı otomatik yetkilendirme testleri yazmakta hala özgürsünüz. Bazı kurallar yalnızca servis katmanınız (CanView / CanSerialize?) Gibi daha yüksek katmanlarda uygulanabilir veya mantıklı olabilir. Ancak, genel olarak en güvenli yetkilendirme stratejisinin "KURU-est" stratejisi olduğunu düşünüyorum: Yetkilendirmeyi olabildiğince düşük, en "ortak" veya "paylaşılan" kodda tutun (auth kurallarını fazla karmaşıklaştırmadan).

Alternatifleri düşünün. Yetkilendirme kurallarınız yalnızca servis katmanında test edilir ve uygulanırsa , zayıf etki alanı nesnelerinizi huysuz bir hizmet nesnesinin isteğine bükecek şekilde bırakıyorsanız, her bir kuralı bir kereden fazla, birden fazla nesnede ve birden fazla nesnede zorlamanız gerekir. her nesneye ve daha karmaşık kodlara yerleştirir.

Ayrıca, analitik ekibiniz etki alanı nesnelerinizi kullanarak raporlama hizmetleri yazmak için bir danışmanlık firması tuttuğunda, bu geliştiricilere güvenmek istemezsiniz! (Ya neyse sen aynı nesneler üzerinde ek hizmetler ve aramaları kurmak. Herhangi Sen iş kuralları ve büyük kitabı yarılıp istemeyeceksiniz sebeple.) Umut düzgün bu kuralları uygulamak için tekrar ; etki alanınızın zaten onları bilmesini ve uygulamasını istiyorsunuz.


@Shoe Endişenizi anlıyorsam - bu önemli bir nokta. Yalnızca bir "yönetici" iş kurallarına göre, bir tane oluşturma iznine sahipse Widget, aynı kural her yerde geçerlidir. (Bu yüzden kimsenin onu görmezden gelmesine izin vermeyin!) Kural her yerde geçerli değilse , bu gerçekten Widgetsve sadece bir kural değildir Widgets. . Kuralları (tek tek kuralların) gidebildiği kadar aşağı itin; ama, "kurallar" gidebildiği kadarıyla değil ... Ayrımı iyi ifade edemediğimi hissediyorum. Ancak, orada bir ayrım olması gerekiyordu.
svidgen

Tecrübelerime göre, yetki kuralları genellikle iş kurallarının bir parçasıdır. Bu nedenle, “gidebildikleri kadar aşağı” genellikle etki alanı katmanımdır. Ancak, "kurallarınızın" düşmesi gereken yerlerin alanınızın, kuralların niteliğinin ve işletmenin kendileri hakkında nasıl konuştuğunun bir sonucudur.
svidgen
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.