[英]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.