gpt4 book ai didi

java - 在自定义事件监听器中注销用户

转载 作者:行者123 更新时间:2023-11-30 11:28:27 24 4
gpt4 key购买 nike

对于 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。 -- Anway,我会从这个开始。它有效,并证明这个概念证明有效,然后我会实现一个更干净的解决方案:

获取所有 LogoutHandler 的列表在 LogoutFilter 注册的 s并直接调用它们然后触发 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);
}

但是

如果你只是想阻止用户因为某些限制而登录,那么实现接口(interface)UserDetailsChecker会更容易和更清晰。并使用 AbstractUserDetailsAuthenticationProvider.preAuthenticationChecks 注册您的实现或 .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!
}
}

关于java - 在自定义事件监听器中注销用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com