《MySql面试专题》
《MySql性能优化的21个最佳实践》
《MySQL高级知识笔记》
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
关注我,点赞本文给更多有需要的人
单点登陆本质上也是 OAuth2 的使用,所以其开发依赖于授权认证服务
一、 单点登陆 Demo 开发
从单点登陆的定义上来看就知道我们需要新建个应用程序,我把它命名为 security-sso-client。接下的开发就在这个应用程序上了。
一、Maven 依赖
主要依赖 spring-boot-starter-security、spring-security-oauth2-autoconfigure、spring-security-oauth2 这 3 个。其中 spring-security-oauth2-autoconfigure 是 Spring Boot 2.X 才有的。
org.springframework.boot
spring-boot-starter-security
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.security.oauth.boot
spring-security-oauth2-autoconfigure
org.springframework.security.oauth
spring-security-oauth2
2.1.7.RELEASE
org.springframework.security.oauth
spring-security-oauth2
2.3.5.RELEASE
复制代码
二、单点配置 @EnableOAuth2Sso
单点的基础配置引入是依赖 @EnableOAuth2Sso 实现的,在 Spring Boot 2.x 及以上版本 的 @EnableOAuth2Sso 是在 spring-security-oauth2-autoconfigure 依赖里的。我这里简单配置了一下:
@Configuration
@EnableOAuth2Sso
public class ClientSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(“/”,“/error”,“/login”).permitAll()
.anyRequest().authenticated()
.and()
.csrf().disable();
}
}
复制代码
因为单点期间可能存在某些问题,会重定向到 /error ,所以我们把 /error 设置成无权限访问。
三、测试接口及页面
测试接口
@RestController
@Slf4j
public class TestController {
@GetMapping(“/client/{clientId}”)
public String getClient(@PathVariable String clientId) {
return clientId;
}
}
复制代码
测试页面
OSS-client
复制代码
四、单点配置文件配置授权信息
由于我们要测试多应用间的单点,所以我们至少需要 2 个单点客户端,我这边通过 Spring Boot 的多环境配置实现。
application.yml 配置
我们都知道单点实现本质就是 Oauth2 的授权码模式,所以我们需要配置访问授权服务器的地址信息,包括 :
-
security.oauth2.client.user-authorization-uri = /oauth/authorize 请求认证的地址,即获取 code 码
-
security.oauth2.client.access-token-uri = /oauth/token 请求令牌的地址
-
security.oauth2.resource.jwt.key-uri = /oauth/token_key 解析 jwt 令牌所需要密钥的地址, 服务启动时会调用 授权服务该接口获取 jwt key,所以务必保证授权服务正常
-
security.oauth2.client.client-id = client1 clientId 信息
-
security.oauth2.client.client-secret = 123456 clientSecret 信息
其中有几个配置需要简单解释下:
-
security.oauth2.sso.login-path=/login OAuth2 授权服务器触发重定向到客户端的路径 ,默认为 /login, 这个路径要与授权服务器的回调地址(域名)后的路径一致
-
server.servlet.session.cookie.name = OAUTH2CLIENTSESSION 解决单机开发存在的问题,如果是非单机开发可忽略其配置
auth-server: http://localhost:9090 # authorization服务地址
security:
oauth2:
client:
user-authorization-uri: ${auth-server}/oauth/authorize #请求认证的地址
access-token-uri: ${auth-server}/oauth/token #请求令牌的地址
resource:
jwt:
key-uri: ${auth-server}/oauth/token_key #解析jwt令牌所需要密钥的地址,服务启动时会调用 授权服务该接口获取jwt key,所以务必保证授权服务正常
sso:
login-path: /login #指向登录页面的路径,即OAuth2授权服务器触发重定向到客户端的路径 ,默认为 /login
server:
servlet:
session:
cookie:
name: OAUTH2CLIENTSESSION # 解决 Possible CSRF detected - state parameter was required but no state could be found 问题
spring:
profiles:
active: client1
复制代码
application-client1.yml 配置
application-client2 和 application-client1 是一样的,只是端口号和 client 信息不一样而已,这里就不再重复贴出了。
server:
port: 8091
security:
oauth2:
client:
client-id: client1
client-secret: 123456
复制代码
五、单点测试
效果如下:
从效果图中我们可以发现,当我们第一次访问 client2 的接口时,跳转到了授权服务的登陆界面,完成登陆后成功跳转回到了 client2 的测试接口,并且展示了接口返回值。此时我们访问 client1 的 测试接口时直接返回(表面现象)了接口返回值。这就是单点登陆的效果,好奇心强的同学一定会在心里问道:它是如何实现的? 那么接下来我们就来揭开其面纱。
二、 单点登陆原理解析
一、@EnableOAuth2Sso
我们都知道 @EnableOAuth2Sso 是实现单点登陆的最核心配置注解,那么我们来看下 @EnableOAuth2Sso 的源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EnableOAuth2Client
@EnableConfigurationProperties(OAuth2SsoProperties.class)
@Import({ OAuth2SsoDefaultConfiguration.class, OAuth2SsoCustomConfiguration.class,
ResourceServerTokenServicesConfiguration.class })
public @interface EnableOAuth2Sso {
}
复制代码
其中我们关注 4 个配置文件的引用: ResourceServerTokenServicesConfiguration 、OAuth2SsoDefaultConfiguration 、 OAuth2SsoProperties 和 @EnableOAuth2Client:
-
OAuth2SsoDefaultConfiguration 单点登陆的核心配置,内部创建了 SsoSecurityConfigurer 对象, SsoSecurityConfigurer 内部 主要是配置 OAuth2ClientAuthenticationProcessingFilter 这个单点登陆核心过滤器之一。
-
ResourceServerTokenServicesConfiguration 内部读取了我们在 yml 中配置的信息
-
OAuth2SsoProperties 配置了回调地址 url ,这个就是 security.oauth2.sso.login-path=/login 匹配的
-
@EnableOAuth2Client 标明单点客户端,其内部 主要 配置了 OAuth2ClientContextFilter 这个单点登陆核心过滤器之一
二、 OAuth2ClientContextFilter
OAuth2ClientContextFilter 过滤器类似于 ExceptionTranslationFilter , 它本身没有做任何过滤处理,只要当 chain.doFilter() 出现异常后 做出一个重定向处理。 但别小看这个重定向处理,它可是实现单点登陆的第一步,还记得第一次单点时会跳转到授权服务器的登陆页面么?而这个功能就是 OAuth2ClientContextFilter 实现的。我们来看下其源码:
public void doFilter(ServletRequest servletRequest,
文末
我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档
- 第一个要分享给大家的就是算法和数据结构
- 第二个就是数据库的高频知识点与性能优化
- 第三个则是并发编程(72个知识点学习)
- 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来
与性能优化**
[外链图片转存中…(img-7NbaMlSq-1715345442418)]
- 第三个则是并发编程(72个知识点学习)
[外链图片转存中…(img-dF00M3Ax-1715345442418)]
- 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料
[外链图片转存中…(img-J9OGkOXn-1715345442418)]
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来