OAuth 2.0 的认证/授权流程 jwt只是认证中的一步
4 中角色 资源拥有者(resource owner)、客户端(client 第三方)、授权服务器(authorization server)和资源服务器(resource server)。
Authorization Code(授权码模式):OAuth2的授权模式,客户端先将用户导向认证服务器,登录后获取授权码,然后进行授权,最后根据授权码获取访问令牌;(先向服务器认证获取授权码,然后用这个授权码访问获取令牌)
隐式授权模式/简化模式 密码模式(自己开发的代码访问) 客户端凭证模式
当访问令牌过期时 去续期
AuthorizationServerConfig 授权服务器 包括了client名称,客户端secret,可授权类型有哪些,令牌过期时间,服务资源的唯一标识resourceIds,scopes范围
ResourceServerConfig 资源服务器 @PreAuthorize( "hasAuthority('back:user:role:set')" ) oauth2的http配置
WebSecurityConfig 在内存中构建身份验证 springsecurity的http配置
UserDetailsService 返回principal主体用户信息UserDetails和passwordEncoder进行验证比较 信息存到上下文!
身份验证的是AuthenticationManager接口,ProviderManager是它的一个默认实现,委托给配置好的AuthenticationProvider(账号+密码/短信/验证码)
拿到了access_token和refresh_token refresh_token 的存在可以减小长期访问令牌(Access Token)的风险
refresh_token是需要客户端秘钥 client_secret 过期并且重新获取的access_token中的refresh_token还是之前的 不然过期时间没意义
配置客户端信息 client-id client-secret redirect scope authorization-grant-type
配置认证服务器信息 @EnableOAuth2Client和@EnableOAuth2Sso
token-uri为认证服务器颁发token的地址
authorization-uri为用于用户授权的页面地址
user-info-uri为获取用户信息的地址
spring.security.oauth2.client.provider.demo-server.user-info-uri= http://localhost:8081/userinfo 服务器需要提供这个接口获取用户信息
配置WebSecurityConfig 那些请求要去认证
如何在不同的请求获取相同认证信息
每次请求都会从session获取信息set到threadlocal中 离开在threadlocal中清除信息
// 在此处从会话中获取认证信息
Authentication authentication = MySessionStorage.getStoredAuthentication( ) ;
// 将认证信息设置回SecurityContextHolder以便在请求中使用
SecurityContextHolder.getContext( ) .setAuthentication( authentication) ;
如何从子线程获取认证信息!
Authentication authentication = SecurityContextHolder.getContext( ) .getAuthentication( ) ;
-Dspring.security.strategy = MODE_INHERITABLETHREADLOCAL
InheritableThreadLocal 创建后主线程修改信息,子线程是感知不到这个变化的。
void createMap( Thread t, T firstValue) {
t.inheritableThreadLocals = new ThreadLocalMap( this, firstValue) ; //父线程中的inheritableThreadLocals变量
}