admin管理员组文章数量:1634439
SpringCloud 2021.0.0.5
单点登录简介
其他临时记录
Spring Security OAuth2 Login学习及浅析 https://blog.csdn/daiwl1988/article/details/106409705
Spring Security+Oauth2+JWT实现用户登录逻辑,以及使用login接口登录成功返回token获取
https://blog.csdn/z132411/article/details/124625900
单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
运行机制
用一个现实中的例子做比较。某公园内部有许多独立的景点,游客可以在各个景点门口单独买票。对于需要游玩所有的景点的游客,这种买票方式很不方便,需要在每个景点门口排队买票。于是绝大多数游客选择在大门口买一张通票(也叫套票),就可以玩遍所有的景点而不需要重新再买票。他们只需要在每个景点门口出示一下刚才买的套票就能够被允许进入每个独立的景点。单点登录的机制也一样。
用户认证
用户认证:这一环节主要是用户向认证服务器发起认证请求,认证服务器给用户返回一个成功的令牌token,主要在认证服务器中完成,即图中的认证系统,注意认证系统只能有一个。
身份校验
身份校验:这一环节是用户携带token去访问其他服务器时,在其他服务器中要对token的真伪进行检验,主要在资源服务器中完成
OAuth2
OAuth2是一种系统授权协议,它包含多种授权类型,任何人都可以基于这个标准开发Oauth2授权服务器,百度开放平台、腾讯开放平台等大部分的开放平台都是基于OAuth2协议实现。
我们可以使用授权码授权和刷新令牌授权两种授权类型来实现单点登录功能。
spring-security-oauth2是对OAuth2协议中授权类型的具体实现,也是我们实现单点登录功能实际用到的代码。
链接:https://blog.csdn/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/pxg943055021/article/details/124752669
##### A系统(单点登录客户端)首次访问受保护的资源触发单点登录流程说明
1、用户通过浏览器访问A系统被保护的资源链接
2、A系统判断当前会话是否登录,如果没有登录则跳转到A系统登录地址/login
3、A系统首次接收到/login请求时没有state和code参数,此时A系统拼接系统配置的单点登录服务器授权url,并重定向至授权链接。
4、单点登录服务器判断此会话是否登录,如果没有登录,那么返回单点登录服务器的登录页面。
5、用户在登录页面填写用户名、密码等信息执行登录操作。
6、单点登录服务器校验用户名、密码并将登录信息设置到上下文会话中。
7、单点登录服务器重定向到A系统的/login链接,此时链接带有code和state参数。
8、A系统再次接收到/login请求,此请求携带state和code参数,系统A通过OAuth2RestTemplate请求单点登录服务端/oauth/token接口获取token。
9、A系统获取到token后,首先会对token进行解析,并使用配置的公钥对token进行校验(非对称加密),如果校验通过,则将token设置到上下文,下次访问请求时直接从上下文中获取。
10、A系统处理完上下问会话之后重定向到登录前请求的受保护资源链接。
##### B系统(单点登录客户端)访问受保护的资源流程说明
1、用户通过浏览器访问B系统被保护的资源链接
2、B系统判断当前会话是否登录,如果没有登录则跳转到B系统登录地址/login
3、B系统首次接收到/login请求时没有state和code参数,此时B系统拼接系统配置的单点登录服务器授权url,并重定向至授权链接。
4、单点登录服务器判断此会话是否登录,因上面访问A系统时登陆过,所以此时不会再返回登录界面。
5、单点登录服务器重定向到B系统的/login链接,此时链接带有code和state参数。
6、B系统再次接收到/login请求,此请求携带state和code参数,系统B通过OAuth2RestTemplate请求单点登录服务端/oauth/token接口获取token。
7、B系统获取到token后,首先会对token进行解析,并使用配置的公钥对token进行校验(非对称加密),如果校验通过,则将token设置到上下文,下次访问请求时直接从上下文中获取。
8、B系统处理完上下问会话之后重定向到登录前请求的受保护资源链接。
认证成功后回跳
Spring Security认证成功后回跳
https://blog.csdn/gangsijay888/article/details/81171647/
SpringSecurity保存登录前的请求页面和跳转回登录前页面的源码分析
https://blog.csdn/HHoao/article/details/124559410
SpringSecurity登录后重定向到登录前访问页面策略 https://blog.csdn/ainizfb/article/details/123221490
基于SpringSecurity OAuth2实现单点登录——集成Github实现第三方账户登录
https://blog.csdn/hou_ge/article/details/120455557
参考地址
Spring Cloud Security:Oauth2实现单点登录
https://www.macrozheng/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/zhangchio/springboot/663138
(附源码)Spring Boot 框架整合 OAuth2 实现单点登录 SSO 详细完整源码教程!
https://blog.csdn/u012811805/article/details/118401750
oauth过滤login_实战干货:OAuth2授权请求是如何构建并执行的
https://blog.csdn/weixin_35860326/article/details/111903783
Spring Security认证成功后回跳(解决前后端分离下OAuth2认证成功回跳)
https://blog.csdn/gangsijay888/article/details/81171647
https://blog.csdn/qq_41739987/article/details/113897091
springsecurity oauth2使用jwt实现单点登录(文章目录)
https://blog.csdn/weixin_44837750/article/details/125767591
其他2
AuthenticationEntryPoint
Springsecurity之AuthenticationEntryPoint
https://blog.csdn/weixin_34010566/article/details/92315781
当用户请求了一个受保护的资源,但是用户没有通过认证,那么抛出异常,AuthenticationEntryPoint. Commence(…)就会被调用。
通过定义AuthenticationEntryPoint统一处理抛出的异常
https://blog.csdn/qq_42971757/article/details/123237420
5.SpringSecurity配置,包括一些登录url,拦截哪些请求,密码加密器,授权管理器,关闭csrf防护,哪些请求需要放行之类的。
6.认证授权服务器配置,主要是对于第三方客户端配置,秘钥,授权成功之后的重定向url ,授权范围,令牌刷新时间,令牌失效时间,授权类型,是否自动授权等信息
7.资源服务器配置,配置需要放行的资源,注意加上@EnableResourceServer注解,目前该资源服务器上只有一个请求当前用户信息的请求表示一个资源
response_type:表示授权类型,必选项,此处的值固定为 “code”
client_id:表示客户端的ID,必选项
redirect_uri:表示重定向URI,可选项
scope:表示申请的权限范围,可选项
state:一般随机生成,标识客户端的当前状态,认证服务器会原样返回这个值
版权声明:本文标题:Spring Cloud Security:Oauth2 单点登录 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729172451a1188483.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论