建设银行南通城区网站,沃家组网网络服务费,普洱在百度上做网站的,wordpress 国内 慢Token 一定要放在请求头中吗#xff1f; 答案肯定是否定的#xff0c;本文将从源码的角度来分享一下 spring security oauth2 的解析过程#xff0c;及其扩展点的应用场景。Token 解析过程说明当我们使用 spring security oauth2 时, 一般情况下需要把认证中心申请的 token …Token 一定要放在请求头中吗 答案肯定是否定的本文将从源码的角度来分享一下 spring security oauth2 的解析过程及其扩展点的应用场景。Token 解析过程说明当我们使用 spring security oauth2 时, 一般情况下需要把认证中心申请的 token 放在请求头中请求目标接口如下图 ①spring security oauth2 通过拦截器获取此 token 完成令牌到当前用户信息(UserDetails)的转换。OAuth2AuthenticationProcessingFilter.doFilterpublic class OAuth2AuthenticationProcessingFilter{public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,ServletException {try {// 1. 根据用户请求解析令牌组装预登陆对象Authentication authentication tokenExtractor.extract(request);if (authentication null) {// 若是预登陆状态为空把无状态登录清空if (stateless isAuthenticated()) {SecurityContextHolder.clearContext();}}else {// 2. 根据token 来做真正的认证登录 ProvierAuthentication authResult authenticationManager.authenticate(authentication);// 3. 登录成功逻辑eventPublisher.publishAuthenticationSuccess(authResult);SecurityContextHolder.getContext().setAuthentication(authResult);}}catch (OAuth2Exception failed) {// 异常通知逻辑 Spring Event...return;}chain.doFilter(request, response);}}我们主要来关注第一步 根据用户请求解析令牌组装预登陆对象来看默认实现 BearerTokenExtractorpublic class BearerTokenExtractor implements TokenExtractor {Overridepublic Authentication extract(HttpServletRequest request) {// 1. 解析tokenString tokenValue extractToken(request);if (tokenValue ! null) {// 2. 创建一个authentication 返回PreAuthenticatedAuthenticationToken authentication new PreAuthenticatedAuthenticationToken(tokenValue, );return authentication;}return null;}protected String extractToken(HttpServletRequest request) {// 1.1 优先从请求header 获取tokenString token extractHeaderToken(request);// 1.2 若是请求token 中没有则获取请求参数中的 access_token 参数if (token null) {token request.getParameter(OAuth2AccessToken.ACCESS_TOKEN);}return token;}}扩展点丰富获取 token 渠道个性化处理.例如掘金的 X-Legacy-Token 而非必须是 Authorization请求参数中携带 access_token 参数也能被正确解析处理重写 BearerTokenExtractor 解决若请求携带 token 无论接口是否被设置 permitAll 都会被拦截判断的问题