在调用资源服务器的过程中,我们会将申请的token 作为header值进行传递,携带调用者的身份信息。但是资源服务器是如何通过token对调用者的身份进行判断的呢?
Security中有一个Filter实现了对token信息的转换,将token值转换成了调用者的用户信息。该filter就是 Oauth2AuthenticationProcessingFilter
一、查看源码
查看Oauth2AuthenticationProcessingFilter的doFilter方法
通过查看Oauth2AuthenticationProcessingFilter的dofilter方法,重点有两点
(1)将request中的token提取出来封装成Authentication对象
(2)将Authentication交给authenticationManager进行鉴权处理
下面我们重点看下这两处的处理。
二、token到Authentication对象转换实现
Authentication authentication = tokenExtractor .extract(request)
tokenExtractor在Oauth2AuthencationProcessingFilter中的默认实现是BearerTokenExtractor,我们查看BearerTokenExtractor的extract()方法。
三、Authentication对象的鉴权
Authentication authResult = authenticationManager .authenticate(authentication)
此处的authenticationManager的实现类是Oauth2AuthenticationManager,而不是我们之前一直提到的ProvicerManager。我们看下Oauth2AuthenticationManager中的authenticate()方法。
RemoteTokenService 的 loadAuthentication() 方法
用户认证转换类
* 接口层注入的 OAuth2Authentication对象中的 principal属性即在该类的extractAuthentication() 方法中实现的。
* security默认使用的是 DefaultAccessTokenConverter类中的extractAuthentication()方法中使用。
* 通过继承UserAuthenticationConverter该类,实现其中的extractAuthentication()方法来满足我们自己构造 principal属性的需求。
* 在ResourceConfig类中,继续使用DefaultAccessTokenConverter,但是类中的UserAuthenticationConverter我们里换成我们自己的CustomUserAuthenticationConverter实现类。
*
* 我们构造的principal属性是map类,里面包含phone和userId两个字段。
1.2. 认证服务器依赖
1.3. 配置文件 application.yml
1.4. 认证服务器配置(核心类AuthorizationServerConfigurerAdapter)
认证服务器配置类必须继承AuthorizationServerConfigurerAdapter类
1.4.1. 内存存储token方案
1.4.2. 配置Spring Security的安全认证
1.4.3. 自定义ClientDetailsService实现类
1.4.4. 相关实体类
1.5. gateway 网关
1.5.1 pom依赖
1.5.2. application.yml配置文件
1.5.3. security安全配置
1.5.4. gateway全局过滤器
1.5.5. 其他类
1.6. 资源服务器
1.6.1. 依赖配置
1.6.2. 资源服务器配置
继承ResourceServerConfigurerAdapter类
安全配置继承WebSecurityConfigurerAdapter
1.6.3 token过滤器
获取从网关处转发的token,填充到认证的安全上下文中,实现身份权限识别
2.2. 安全配置
2.3. 其他配置
2.4. 身份信息过滤
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)