2008-10-08 24 views
32

Spring Security yeniyim "başarılı bir giriş etkinliği dinleyicisi" ekleyerek. Başarılı bir şekilde kullanıcı günlükleri olarak adlandırılacak bir olay dinleyicisini nasıl ekleyebilirim? Ayrıca, bu dinleyicide daha fazla erişilebilir olması gereken bir tür benzersiz oturum kimliği almam gerekiyor. Başka bir sunucuyla senkronize etmek için bu kimliğe ihtiyacım var.Bahar güvenliği:

cevap

41

Sen ApplicationListener uygulayan bir bahar Bean tanımlamanız gerekir.

Sonra kodunuzda, böyle bir şey yapmak:

public void onApplicationEvent(ApplicationEvent appEvent) 
{ 
    if (appEvent instanceof AuthenticationSuccessEvent) 
    { 
     AuthenticationSuccessEvent event = (AuthenticationSuccessEvent) appEvent; 
     UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal(); 

     // .... 
    } 
} 

Ardından, applicationContext.xml dosyasında, sadece bu fasulye tanımlamak ve otomatik olarak olayları :)

+0

teşekkürler! Sadece AuthenticationSuccessEvent öğesini buldu ancak bir dinleyicinin nasıl kaydedileceğini anlamaya çalışıyordum. – axk

+2

sorduğu oturum kimliği ne olacak? – siebmanb

+1

@siebmanb sadece dinleyiciye '@Outowired HttpSession session' ekleyin. Bahar, düzeltme oturumuna otomatik olarak atanan bir vekil enjekte edecektir. –

10

Grails olarak almaya başlayacak Bahar Güvenlik Eklentisi'yle, sen Config.groovy yapabilirsiniz:

grails.plugins.springsecurity.useSecurityEventListener = true 

grails.plugins.springsecurity.onAuthenticationSuccessEvent = { e, appCtx -> 

     def session = SecurityRequestHolder.request.getSession(false) 
     session.myVar = true 

} 
+0

Sağ yönlü Config.groovy def isteği = RequestContextHolder isteği almak için .currentRequestAttributes(); – openSource

+1

Bu etkinlikte mevcut giriş yapan kullanıcıyı nasıl alacağını bilen var mı? Şu anda kullanıyorum "def springSecurityService = Holders.grailsApplication.mainContext.getBean 'springSecurityService'; def user = springSecurityService.getPrincipal() 'ancak kullanıcı her zaman boştur. Teşekkür ederim! DÜZENLEME:. Def kullanıcıyı yapıyor gibi görünüyor = event.getAuthentication() getPrincipal() inşaat büyük! – Dinoo

21

Phill cevap benzer ancak dikkate Genellemelere almaya değiştirilme:

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> { 

    @Override 
    public void onApplicationEvent(final AuthenticationSuccessEvent event) { 

     // ... 

    } 

} 
38

AuthenticationSuccessEvent ile ilgili sorun, beni hatırla hesabında yayınlanmadı. Beni hatırla kimlik doğrulaması kullanıyorsanız, bunun yerine InteractiveAuthenticationSuccessEvent öğesini kullanın, hatırla-beni oturum açmanın yanı sıra normal oturum açma için de çalışır.

@Component 
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> { 

    @Override 
    public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) 
    { 
     UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal(); 
     // ... 
    } 
} 
+1

Çok teşekkürler! Bunu, başarılı bir başarı işleyicisi kullanarak gerçekleştirmeye çalıştım, ancak şu sorunla karşılaştı: http://stackoverflow.com/questions/11575860/remember-me-and-authentication-success-handler. Cevabınız durumu kurtardı! – yname