2008-10-08 44 views
32

Tôi mới sử dụng Bảo mật mùa xuân. Làm cách nào để thêm trình xử lý sự kiện sẽ được gọi là người dùng đăng nhập thành công? Ngoài ra tôi cần phải nhận được một số loại ID phiên duy nhất trong trình lắng nghe này sẽ có sẵn thêm. Tôi cần ID này để đồng bộ hóa với một máy chủ khác.Bảo mật mùa xuân: thêm "Khi người nghe sự kiện đăng nhập thành công"

Trả lời

41

Bạn cần xác định một Spring Bean thực hiện ApplicationListener.

Sau đó, trong mã của bạn, làm một cái gì đó như thế này:

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

     // .... 
    } 
} 

Sau đó, trong tập tin applicationContext.xml bạn, chỉ cần xác định đậu đó và nó sẽ tự động bắt đầu nhận các sự kiện :)

+0

Cảm ơn! Chỉ cần tìm thấy AuthenticationSuccessEvent nhưng đã cố gắng tìm ra cách để đăng ký một người nghe. – axk

+2

ID phiên mà anh ta hỏi về điều gì? – siebmanb

+1

@siebmanb chỉ cần thêm '@Autowired HttpSession session' vào trình nghe. Spring sẽ tiêm một proxy đại diện tự động cho phiên điều chỉnh. –

10

Trong Grails , với xuân an Plugin, bạn có thể làm điều này trong Config.groovy:

grails.plugins.springsecurity.useSecurityEventListener = true 

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

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

} 
+0

Cách thích hợp để nhận yêu cầu trong Config.groovy def request = RequestContextHolder? .currentRequestAttributes(); – openSource

+1

Có ai biết cách đăng nhập người dùng hiện tại trong sự kiện này không? Tôi hiện đang sử dụng 'def springSecurityService = Holders.grailsApplication.mainContext.getBean 'springSecurityService'; def user = springSecurityService.getPrincipal() 'nhưng người dùng luôn là null. Cảm ơn bạn! EDIT: Hình như làm def user = event.getAuthentication(). GetPrincipal() hoạt động tốt! – Dinoo

21

Tương tự như câu trả lời Phill, nhưng sửa đổi để lấy Generics xem xét:

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> { 

    @Override 
    public void onApplicationEvent(final AuthenticationSuccessEvent event) { 

     // ... 

    } 

} 
38

Sự cố với AuthenticationSuccessEvent là nó không được xuất bản khi đăng nhập nhớ-tôi. Nếu bạn đang sử dụng xác thực nhớ-tôi, hãy sử dụng InteractiveAuthenticationSuccessEvent để thay thế, nó hoạt động cho việc đăng nhập bình thường cũng như cho việc đăng nhập nhớ-tôi.

@Component 
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> { 

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

Cảm ơn rất nhiều! Tôi đã cố gắng để đạt được điều này bằng cách sử dụng auth-success-handler, nhưng phải đối mặt với vấn đề này: http://stackoverflow.com/questions/11575860/remember-me-and-authentication-success-handler. Câu trả lời của bạn đã giải quyết tình huống! – yname

Các vấn đề liên quan