2013-07-01 38 views
10

Web uygulamamı korumak için Apache Shiro çerçevesini kullanmaya çalışıyorum (UI Vaadin 6'ya dayanmaktadır). Shiro'nun sitesindeki tüm örneklere bakıp saatlerce çalıştım, ancak aşağıdaki gereksinimlerle başa çıkmak için temiz bir yol bulamıyorum.Apache Shiro kullanarak hiyerarşik roller/izinler nasıl ele alınır?

Uygulamanın, kullanıcıların şirket hiyerarşisindeki belirli departmanlara ait faaliyetler oluşturduğu bir tür proje yönetim aracı olduğunu varsayarsak. Her kullanıcı çeşitli departmanlarda çalışabilir ve her departmanda farklı güvenlik rollerine sahip olabilir. Örnek:

 
Department A  - User is 'Manager' here 
Department B 
    Department C  - User is 'Admin' here 
    Department D 

Kullanıcı Bölümü A Kullanıcı 'Yönetici' olduğu da (Bölüm C atası) Bölümü D için 'Yönetici' rolünü alması gerektiğini Bölümü C Kullanıcı 'Yönetici' olduğunu.

Yani, temel izin onay (bazı bölüme ait etkinliğini görüntülemek isteyen varsayarak) olacaktır: aktivite kullanıcı görünümüne çalışıyor

  1. Kontrol eğer bölüm kullanıcıya ait bir role sahip olduğu;
  2. Kullanıcının bu bölümde numaralı telefon hattında bulunan numaralı rol için gerekli izni aldığını kontrol edin.

Yalnızca "sistem genelinde rol" değil, "bu bölümdeki rol" kavramının nasıl uygulanacağının anlaşılmasında mevcut durumdayım.

Yukarıdaki örneği "etkinlik: görünüm: 123" gibi izin dizgisine nasıl dönüştürebilirim? İş mantığımdaki izni nasıl kontrol edeceğim?

Şiro ile uygulama bir kez daha şüphesiz, kendi uygulamalarımın sağlanmasına yönelik minimum çaba sarf edecek bir çözüm kullanmak istiyorum. Ancak, Shiro'nun yerleşik uygulamalarının sadece basit vakalar için tasarlandığı görülmektedir. Başlamak için karmaşık yetkilendirme uygulamasının herhangi bir örneği var mı (yukarıdaki durumu kapsayabilir)?

cevap

3

Sadece bu sorunla ilgili çözümümüzü açıklamak istiyorum, ki bu da birisi için yararlı olabilir. Bunun optimal olmayabileceğini hissediyorum, bu yüzden hala daha temiz bir uygulama hakkındaki önerilere açık.

  • aktivite: düzenlemek
  • aktivite: view

Ve ayrıca izinleri geniş değildir sistemi olduğundan emin olmak gerekir, ancak bağlıdır

Aşağıdaki işlemleri güvenli gerekir varsayarsak özellikle departmandaki rolüm. Yaptığım şey, Benim Bölgemde kullanıcı için 'departmana bağımlı' iznini açıkça ekledi. Örnek (post hiyerarşiyi bakınız):

  • DEP_A: aktivite: view
  • DEP_C: aktivite: view
  • DEP_C: aktivite: Ben eylem olmadığını kontrol etmek istediğiniz her zaman

düzenlemek bazı etkinliklere karşı izin verilir veya verilmez, kontrol edilecek izinlerin bir listesini oluşturuyorum.Örnek A, D'ye aittir, onu 'görmek' istiyorum. kontrol etmek İzinler olacaktır:

  • DEP_D: aktivite: view
  • DEP_C: aktivite: view
  • DEP_B: aktivite: view

Bölümde C Yönetici olduğum, ederdim 'DEP_C: activity: view' izni var ve dolayısıyla kontrolü geçecek. Bu, şirket yapısı hiyerarşisinde hakların mirasının uygulanmasına izin verir. İşte

izni kontrolleri için sorumlu benim hizmet sınıfından kodu snipplet geçerli:

@Override 
    public void checkIfOperationPermitted(SecurityOperation operation, 
     Object object) 
    { 
     final Subject currentUser = SecurityUtils.getSubject(); 

     if(currentUser.isPermitted(
     SecurityOperation.SYSTEM_ADMIN.getPermissionString()) || 
     currentUser.hasRole("admin")) 
     { 
     // no need to check anything else, 
     // admin is system wide role. 
     return; 
     } 

     if(object instanceof Activity) 
     { 
     // Activity permissions fully depends on organization and 
     // product hierarchies. PermissionResolver is just a class 
     // which generates list of permission strings based on 
     // department activity is belonging to. 
     Activity a = (Activity) object; 
     List<String> permissionsToCheck = 
      permissionResolver.resolveHierarchicalPermissions(operation, a); 
     boolean permitted = false; 
     for(String permission: permissionsToCheck) 
     { 
      if(currentUser.isPermitted(permission)) 
      { 
       permitted = true; 
       break; 
      } 
     } 
     if(!permitted) 
     { 
      throw new UnauthorizedException("Access denied"); 
     } 
     } 
     else 
     { 
     // Check for system wide permissions 
     currentUser.checkPermission(operation.getPermissionString()); 
     } 
    } 

Ben düşünüyordum başka yolu da içinde olabilir benim Realm kullanıcı için tüm bu izinleri ekleyin, ancak bu firma beri hiyerarşiyi azaldı olduğunu genel N katmanları içerir - belirli kullanıcı için izin listesinde çoğaltmayı büyük ölçüde artırır (bellek kullanımı).

İlgili konular