SpringSecurityOauth2 - Token校验逻辑,以及认证对象如何存到Security上下文中的(RemoteTokenServices)

本文探讨了SpringSecurityOauth2中Token的校验逻辑,从OAuth2AuthenticationProcessingFilter过滤器开始,经过OAuth2AuthenticationManager,利用RemoteTokenServices和CheckTokenEndpoint进行验证。通过DefaultAccessTokenConverter和DefaultUserAuthenticationConverter,认证对象被封装并存入SecurityContextHolder的上下文中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键词:
DefaultTokenServices, RemoteTokenServices, Authentication , SecurityContextHolder

入口一定是过滤器 而 SpringSecurityOauth2 资源服务器处理 Token校验的过滤器是 OAuth2AuthenticationProcessingFilter 我们直接从这个地方打断点进行分析:

FilterChainProxy

public class FilterChainProxy extends GenericFilterBean {
   

  private static final class VirtualFilterChain implements FilterChain {
   
  
   		private final FilterChain originalChain;
        private final List<Filter> additionalFilters;
        private final FirewalledRequest firewalledRequest;
        private final int size;
        private int currentPosition;

        private VirtualFilterChain(FirewalledRequest firewalledRequest, FilterChain chain, List<Filter> additionalFilters) {
   
            this.currentPosition = 0;
            this.originalChain = chain;
            this.additionalFilters = additionalFilters;
            this.size = additionalFilters.size();
            this.firewalledRequest = firewalledRequest;
        }

        public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
   
            if (this.currentPosition == this.size) {
   
                if (FilterChainProxy.logger.isDebugEnabled()) {
   
                    FilterChainProxy.logger.debug(LogMessage.of(() -> {
   
                        return "Secured " + FilterChainProxy.requestLine(this.firewalledRequest);
                    }));
                }

                this.firewalledRequest.reset();
                this.originalChain.doFilter(request, response);
            } else {
   
                ++this.currentPosition;
                Filter nextFilter = (Filter)this.additionalFilters.get(this.currentPosition - 1);
                if (FilterChainProxy.logger.isTraceEnabled()) {
   
                    FilterChainProxy.logger.trace(LogMessage.format("Invoking %s (%d/%d)", nextFilter.getClass().getSimpleName(), this.currentPosition, this.size));
                }
				
				// OAuth2AuthenticationProcessingFilter 用来校验Token的
                nextFilter.doFilter(request, response, this);
            }
        }
  }

}

OAuth2AuthenticationProcessingFilter


public class OAuth2AuthenticationProcessingFilter implements Filter, InitializingBean {
   
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
				ServletException {
   
	
			final boolean debug = logger.isDebugEnabled();
			final HttpServletRequest request = (HttpServletRequest) req;
			final HttpServletResponse response = (HttpServletResponse) res;
	
			try {
   
	
				Authentication authentication = tokenExtractor.extract(request);
				
				if (authentication == null) {
   
					if (stateless && isAuthenticated()) {
   
						if (debug) {
   
							logger.debug("Clearing security context.");
						}
						SecurityContextHolder.clearContext();
					}
					if (debug) {
   
						logger.debug(&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值