SpringCloud 2021.0.0.5
单点登录简介
其他临时记录
Spring Security OAuth2 Login学习及浅析 https://blog.csdn.net/daiwl1988/article/details/106409705
Spring Security+Oauth2+JWT实现用户登录逻辑,以及使用login接口登录成功返回token获取
https://blog.csdn.net/z132411/article/details/124625900
单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
运行机制
用一个现实中的例子做比较。某公园内部有许多独立的景点,游客可以在各个景点门口单独买票。对于需要游玩所有的景点的游客,这种买票方式很不方便,需要在每个景点门口排队买票。于是绝大多数游客选择在大门口买一张通票(也叫套票),就可以玩遍所有的景点而不需要重新再买票。他们只需要在每个景点门口出示一下刚才买的套票就能够被允许进入每个独立的景点。单点登录的机制也一样。
用户认证
用户认证:这一环节主要是用户向认证服务器发起认证请求,认证服务器给用户返回一个成功的令牌token,主要在认证服务器中完成,即图中的认证系统,注意认证系统只能有一个。
身份校验
身份校验:这一环节是用户携带token去访问其他服务器时,在其他服务器中要对token的真伪进行检验,主要在资源服务器中完成
OAuth2
OAuth2是一种系统授权协议,它包含多种授权类型,任何人都可以基于这个标准开发Oauth2授权服务器,百度开放平台、腾讯开放平台等大部分的开放平台都是基于OAuth2协议实现。
我们可以使用授权码授权和刷新令牌授权两种授权类型来实现单点登录功能。
spring-security-oauth2是对OAuth2协议中授权类型的具体实现,也是我们实现单点登录功能实际用到的代码。
链接:https://blog.csdn.net/pxg943055021/article/details/124752669
Spring-Security-Oauth2默认实现的授权类型
授权码授权(Authorization Code)
刷新令牌授权(Refresh Token)
.
演示单点登录功能
.
一 创建oauth2-client 服务模块
子模块只需在启动类引入注解 @EnableOAuth2Sso
pom.xml中添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
application.yml
授权服务器校验需要在资源服务器和授权服务器配置好client-id和client-secret。
security密码不用手动设置。
server:
port: 9501
spring:
application:
name: client01
# oauth2的认证 appid appsecret
sso-server-url: http://localhost:9401
security:
oauth2:
client:
client-id: client01
client-secret: 123456
#认证服务器接受认证的接口地址,这里的地址和端口要与认证服务器中的配置一致
user-authorization-uri: ${sso-server-url}/oauth/authorize
#获取根据授权码去请求令牌的地址
access-token-uri: ${sso-server-url}/oauth/token
#去认证服务器获取解析JWT的密钥的地址
resource:
jwt:
# 获取公钥的地址,验证token需使用,系统启动时会初始化,不会每次验证都请求
key-uri: ${sso-server-url}/oauth/token_key
key-value: test_key
启动类引入注解 @EnableOAuth2Sso
- 在启动类上添加@EnableOAuth2Sso注解来启用单点登录功能
- 添加接口用于获取当前登录用户信息
认证服务器配置
-
SpringSecurity配置
SpringSecurity配置,包括一些登录url,拦截哪些请求,密码加密器,授权管理器,关闭csrf防护,哪些请求需要放行之类的。 -
配置AuthorizationServerConfig
修改oauth2-sso-server模块中的配置AuthorizationServerConfig类,将绑定的跳转路径为http://localhost:9501/login,并添加获取秘钥时的身份认证。
自动授权后会跳转到原来需要权限的接口地址,展示登录用户信息;
AuthorizationServerConfigurerAdapter中:
ClientDetailsServiceConfigurer:用来配置客户端详情服务(ClientDetailsService),客户端详情信息在这里进行初始化,你能够把客户端详情信息写死在这里或者是通过数据库来存储调取详情信息。
AuthorizationServerSecurityConfigurer:用来配置令牌端点(Token Endpoint)的安全约束.
AuthorizationServerEndpointsConfigurer:用来配置授权(authorization)以及令牌(token)的访问端点和令牌服务(token services)。
其他
两个地方自定义用户身份验证
可以在两个地方设置自定义用户身份验证
- AuthorizationServerConfigurerAdapter 中自定义身份验证
@Configuration
public class SsoAuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService) //自定义身份验证
}
- WebSecurityConfigurerAdapter 中自定义身份验证
@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
//auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder().encode("123456")).roles("Admin");
//auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
// 使用自定义身份验证组件
// 指定密码加密策略 JwtAuthenticationProvider extends DaoAuthenticationProvider
auth.authenticationProvider(new JwtAuthenticationProvider(userDetailsService));
}
//...
}
完
spring-security-oauth2 单点登录代码实现流程说明:
1、用户通过浏览器访问单点登录被保护的资源链接
2、SpringSecurity通过上下文判断是否登录(SpringSecurity单点登录服务端和客户端默认都是基于session的),如果没有登录则跳转到单点登录客户端地址/login
3、单点登录客户端OAuth2ClientAuthenticationProcessingFilter拦截器通过上下文获取token,因第一次访问单点登录客户端/login时,没有code和state参数,所以抛出UserRedirectRequiredException异常
4、单点登录客户端捕获UserRedirectRequiredException异常,并根据配置文件中的配置,组装并跳转到单点登录服务端的授权链接/oauth/authorize,链接及请求中会带相关配置参数
5、单点登录服务端收到授权请求,根据session判断是否此会话是否登录,如果没有登录则跳转到单点登录服务器的统一登录界面(单点登录服务端也是根据session判断是否登录的,在这里为了解决微服务的session集群共享问题,引入了spring-session-data-redis)
6、用户完成登录操作后,单点登录服务端重定向到单点登录客户端的/login链接,此时链接带有code和state参数
7、再次用到第三步的OAuth2ClientAuthenticationProcessingFilter拦截器通过上下文获取token,此时上下文中肯定没有token,所以会通过OAuth2RestTemplate请求单点登录服务端/oauth/token接口使用重定向获得的code和state换取token
8、单点登录客户端获取到token后,首先会对token进行解析,并使用配置的公钥对token进行校验(非对称加密),如果校验通过,则将token设置到上下文,下次访问请求时直接从上下文中获取。
9、单点登录客户端处理完上下问会话之后重定向到登录前请求的受保护资源链接。
三、使用【授权码授权】和【刷新令牌授权】来实现单点登录服务器
————————————————
链接:https://blog.csdn.net/pxg943055021/article/details/124752669
参考地址
Spring Cloud Security:Oauth2实现单点登录
https://www.macrozheng.com/cloud/oauth2_sso.html#oauth2-client%E6%B7%BB%E5%8A%A0%E6%9D%83%E9%99%90%E6%A0%A1%E9%AA%8C
简述 spring security oauth2的认证 client模式
Spring Security Oauth2 https://www.kancloud.cn/zhangchio/springboot/663138
(附源码)Spring Boot 框架整合 OAuth2 实现单点登录 SSO 详细完整源码教程!
https://blog.csdn.net/u012811805/article/details/118401750
oauth过滤login_实战干货:OAuth2授权请求是如何构建并执行的
https://blog.csdn.net/weixin_35860326/article/details/111903783
Spring Security认证成功后回跳(解决前后端分离下OAuth2认证成功回跳)
https://blog.csdn.net/gangsijay888/article/details/81171647
https://blog.csdn.net/qq_41739987/article/details/113897091
AuthenticationEntryPoint
Springsecurity之AuthenticationEntryPoint
https://blog.csdn.net/weixin_34010566/article/details/92315781
当用户请求了一个受保护的资源,但是用户没有通过认证,那么抛出异常,AuthenticationEntryPoint. Commence(…)就会被调用。
通过定义AuthenticationEntryPoint统一处理抛出的异常
https://blog.csdn.net/qq_42971757/article/details/123237420
5.SpringSecurity配置,包括一些登录url,拦截哪些请求,密码加密器,授权管理器,关闭csrf防护,哪些请求需要放行之类的。
6.认证授权服务器配置,主要是对于第三方客户端配置,秘钥,授权成功之后的重定向url ,授权范围,令牌刷新时间,令牌失效时间,授权类型,是否自动授权等信息
7.资源服务器配置,配置需要放行的资源,注意加上@EnableResourceServer注解,目前该资源服务器上只有一个请求当前用户信息的请求表示一个资源
response_type:表示授权类型,必选项,此处的值固定为 “code”
client_id:表示客户端的ID,必选项
redirect_uri:表示重定向URI,可选项
scope:表示申请的权限范围,可选项
state:一般随机生成,标识客户端的当前状态,认证服务器会原样返回这个值