簡體   English   中英

在自定義事件偵聽器中注銷用戶

[英]Logout user in custom event listener

對於Spring Security,我需要在AuthenticationSuccessEvent注銷用戶。 如果用戶使用有效的憑據登錄,我想根據一些限制注銷該用戶。

我怎樣才能做到這一點?

@Override
public void onApplicationEvent(AbstractAuthenticationEvent appEvent) {
    if (appEvent instanceof AuthenticationSuccessEvent) {
        if(Condition true)
        {
            //LOGOUT
        }
    }

我尚未在AuthenticationSuccessEvent完成此操作,但是嘗試做的是LogoutFilter所做的相同操作。

不幸的是, LogoutFilter直接在其處理程序方法LogoutFilter.doFilter(ServletRequest req, ServletResponse res, FilterChain chain)直接執行注銷處理,因此直接調用它是一種技巧(但並非不可能)

@Autowired
LogoutFilter logoutFilter;


private void doLogout() {
    MockHttpServletRequest request = new MockHttpServletRequest(
          "GET",
          "http://myApp" + this.logoutFilter.getFilterProcessingUrl());        

    this.logoutFilter.doFilter(request, new MockHttpServletResponse(),
                               new MockFilterChain());
}

但這是一個hack。 -嗯,我將從這個開始。 它確實有效,並表明此概念證明有效,然后我將采用一種更為簡潔的解決方案:

Obain所有的列表LogoutHandler與該注冊小號LogoutFilter並直接調用它們,然后火logoutSuccessHandler.onLogoutSuccess (也就是LogoutFilter不正是)。

@Autowired
List<LogoutHandler> logoutHandlers;

@Autwired
LogoutSuccessHandler logoutSuccessHandler;

private void doLogout() {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    for (LogoutHandler handler : handlers)
         handler.logout(request, response, auth);

    logoutSuccessHandler.onLogoutSuccess(request, response, auth);
}

如果僅由於某些限制而只希望阻止用戶登錄,則實現接口UserDetailsChecker並向AbstractUserDetailsAuthenticationProvider.preAuthenticationChecks.postAuthenticationChecks注冊實現的實現會更加容易和.postAuthenticationChecks (很可能您使用的是DaoAuthenticationProvider ,它是一個子類的AbstractUserDetailsAuthenticationProvider

(提示: void UserDetailsChecker.check(UserDetails toCheck)這是唯一的一個方法UserDetailsChecker ) -需要拋出一個異常,如果它想阻止用戶登錄。)

 private class Demo implements UserDetailsChecker {
    public void check(UserDetails user) {
        if (!user.isAccountNonLocked())
            throw new LockedException("User account is locked");
        if (!user.isEnabled())
            throw new DisabledException("User is disabled"));
        if (!user.isAccountNonExpired())
            throw new AccountExpiredException("User account has expired");
        //And here comes you!
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM