spring-security 源码分析-remember me

AbstractAuthenticationProcessingFilter#doFilter
-> AbstractRememberMeServices#loginSuccesssuccessfulAuthentication

	protected void successfulAuthentication(HttpServletRequest request,
			HttpServletResponse response, FilterChain chain, Authentication authResult)
			throws IOException, ServletException {

		SecurityContextHolder.getContext().setAuthentication(authResult);

		rememberMeServices.loginSuccess(request, response, authResult);

		// Fire event
		if (this.eventPublisher != null) {
			eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(
					authResult, this.getClass()));
		}

		successHandler.onAuthenticationSuccess(request, response, authResult);
	}

从这个代码能看主要的流程:

  1. 把前面认证的结果放到全局变量SecurityContext中
  2. 调用rememberMeServices.loginSuccess
  3. 如果有eventPublisher ,推送事件
  4. 调用成功处理器。

在上面的第2步中,实质上PersistentTokenBasedRememberMeServices#onLoginSuccess

protected void onLoginSuccess(HttpServletRequest request,
			HttpServletResponse response, Authentication successfulAuthentication) {
		String username = successfulAuthentication.getName();
		PersistentRememberMeToken persistentToken = new PersistentRememberMeToken(
				username, generateSeriesData(), generateTokenData(), new Date());
		try {
			tokenRepository.createNewToken(persistentToken);
			addCookie(persistentToken, request, response);
		}
	}

调用jdbc插入token

public void createNewToken(PersistentRememberMeToken token) {
		getJdbcTemplate().update(insertTokenSql, token.getUsername(), token.getSeries(),
				token.getTokenValue(), token.getDate());
	}

eventPublisher如何用?怎么Publish 事件?什么场景下使用?

猜你喜欢

转载自blog.csdn.net/mingtiandexia/article/details/89162902