Spring Security在运行时注销用户
我正在实现一个基于Spring的Web应用程序,它使用Spring Security和DaoAuthenticationProvider。 因此我创建了一个具有布尔值isEnabled()的用户类; 方法因为它实现了Springs UserDetails接口。 因此,如果用户“未启用”,则此用户将无法再登录。 到现在为止还挺好。 如果我在运行时仍然登录时禁用用户,(似乎)此用户保持登录状态,直到http会话结束,但我希望用户在设置禁用后立即登出。 我怎样才能做到这一点?
谢谢。
假设您有一个能够禁用用户的正在运行的Web应用程序,我将向您展示如何在运行时锁定这些用户。
基本思想是使用刷新的用户详细信息重新validation每个请求。 为此,您需要一个自定义的SecurityContextRepository
,它会丢弃在http会话中保存的用户详细信息。
public class RefreshingUserDetailsSecurityContextRepository implements SecurityContextRepository { private final SecurityContextRepository delegate; private final UserDetailsService userDetailsService; public RefreshingUserDetailsSecurityContextRepository(final SecurityContextRepository delegate, final UserDetailsService userDetailsService) { Assert.notNull(delegate); Assert.notNull(userDetailsService); this.delegate = delegate; this.userDetailsService = userDetailsService; } @Override public SecurityContext loadContext(final HttpRequestResponseHolder requestResponseHolder) { SecurityContext securityContext = delegate.loadContext(requestResponseHolder); if(securityContext.getAuthentication() == null) { return securityContext; } Authentication principal = securityContext.getAuthentication(); UserDetails userDetails = userDetailsService.loadUserByUsername(principal.getName()); //this code has to be modified when using remember me service, jaas or a custom authentication token UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword()); securityContext.setAuthentication(token); saveContext(securityContext, requestResponseHolder.getRequest(), requestResponseHolder.getResponse()); return securityContext; } @Override public void saveContext(final SecurityContext context, final HttpServletRequest request, final HttpServletResponse response) { delegate.saveContext(context, request, response); } @Override public boolean containsContext(final HttpServletRequest request) { return delegate.containsContext(request); } }
RefreshingUserDetailsSecurityContextRepository
只包含默认的SecurityContextRepository
,即HttpSessionSecurityContextRepository
。 因此,您无需担心会话超时或自己存储SecurityContext
。 在loadContext
方法中,用户详细信息将使用userDetailsService
刷新,并在将其传递给调用者之前写回SecurityContext
。
不要将用户权限传递给UsernamePasswordAuthenticationToken
构造函数。 否则令牌被标记为已validation,并且重新认证永远不会是triggererd!
请注意, RefreshingUserDetailsSecurityContextRepository
您限制为UsernamePasswordAuthenticationToken
。 例如,如果您想使用Jaas,Spring Security会记住我或者不是从UsernamePasswordAuthenticationToken
派生的自定义身份validation令牌,您需要根据需要调整RefreshingUserDetailsSecurityContextRepository
。
将RefreshingUserDetailsSecurityContextRepository
添加到您的安全配置中。
而已。 您登录但已禁用的用户会在下一页请求时重定向回登录页面。
这是一个function齐全的例子 。