spring security auth2.0实现

spring security auth2.0实现_第1张图片

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变量
}

你可能感兴趣的:(spring,java,后端)