2010-07-06 11 views
5

Bir uygulama geliştiriyoruz (Grails Spring Security (eski Acegi) kullanarak), 10-15 farklı kullanıcı türünü kapsayan binlerce kullanıcımız olacak. Geçerli sistemde, her kullanıcı tipi bir "grup" a eşittir ve belirli roller ve izinler gruba bağlanır. Kullanıcı tüm "rollerini" grubundan alır. rolleri = do_flip, walk_tightrope, Biz üç kullanıcıları, bir atanmışSpring Security (Acegi) ve kullanıcı Grupları (Roller gibi)

receive_applause: AKROBAT receive_applause, roller = ride_clown_car, toot_horn:

PALYAÇO:

Örneğin, iki kullanıcı grubuna sahip olabilir ACROBAT grubuna atanan ve her ikisine birden atanan CLOWN grubu (CLOWN ve ACROBAT rolleri birleşimine sahiptir).

İzinleri değiştirirsek, bunu grup düzeyinde yaparız. Örneğin, ACROBAT grubuna bir swing_on_trapeze iznini eklersek, tüm akrobatlar otomatik olarak devralır.

Grails terimlerinde, denetleyicilerin izinleri hala rol düzeyinde olacaktır. Dolayısıyla, @Secured (['toot_horn']) ile bir eylem CLOWN grubundaki kullanıcılara izin verir, ancak ACROBAT grubunda bulunmaz. @Secured (['rece_applause']), CLOWNS ve ACROBATS'a izin verir.

Bunu, Spring Güvenlik'te, modelin iki aşamalı yapısı (kullanıcı, rol) göz önünde bulundurarak nasıl yapabilirim? Gruplara dayalı rolleri toplamak için kendi özel kimlik doğrulamayı uygulamam gerekir mi?

Teşekkürler!

+0

: Zaten bir uygulama tanımlı getAuthorities yöntemine bağlıdır beri

relationalAuthorities='allRoles' 

yüzden sadece Kullanıcı sınıfında böyle bir şey kullanmak, Bahar Güvenlik çekirdek eklentisi için gerekli yapılandırma yok seninkilere çok benziyor. Davanıza "grails.plugin.springsecurity.userLookup.authorityJoinClassName" nasıl ayarlanıyor? İki seviyeli bir sistemde, bu sadece asıl rolleri/yetkilileri tanımlayan birinci seviyeye (kullanıcı grubu) işaret edebilir. – sola

cevap

7

Acegi eklentisi geliştirilmediğinden ve temel olarak kullanımdan kaldırıldığından yeni Spring Security Core plugin kullanıyor olmalısınız.

Ancak her iki eklenti de, kullanıcı sınıfınızda rol örneklerini döndüren getAuthorities() yöntemi gibi bir şey olmasını bekler. kullanıcı birçok grubuna sahip Böyle bir senaryoda, sadece grupların rolleri toplamak:

class User { 
    ... 
    def getAllRoles() { 
     Set allRoles = [] 
     groups.each { allRoles.addAll it.roles } 
     allRoles 
    } 
} 

Bu olduğunu varsayar bir sayıda çoğa Kullanıcı ve Grup arasında:

static hasMany = [groups: Group] 

ve Grup sahip birçok çoğa Rolü ile:

static hasMany = [roles: Role] 

bu SecurityConfig.groovy içinde 'allRoles' için 'relationalAuthorities' özelliğini ayarlayın kullanmak için kullandığı böylece yerine birçok çoğa arasında kullanıcı ve rol: Bir şey uygulamak am

Set<Role> getAuthorities() { 
    Set allRoles = [] 
    groups.each { allRoles.addAll it.roles } 
    allRoles 
} 
+0

İlkbaharda, Spring Security'nin Roller'e doğrudan erişmediği, sadece Kullanıcı üzerindeki toplayıcı yöntemiyle gerçekleşmemişti. Bu basit, zarif çözümü çok hızlı bir şekilde gönderdiğiniz için teşekkürler! Bunu takdir ediyorum. Ve eklentinin kendisi üzerindeki tüm çalışmalarınız için teşekkürler! – ecodan

+0

@Burt: Ecodan'ınkine çok benzeyen bir şey uyguluyorum. Bu durumda "grails.plugin.springsecurity.userLookup.authorityJoinClassName" öğesini nasıl değiştiririm? – sola