Java最全实战~ 基于Security+JWT的单点登陆开发及原理解析,遇到的面试官都是架构师级别

《MySql面试专题》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySql性能优化的21个最佳实践》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySQL高级知识笔记》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

关注我,点赞本文给更多有需要的人

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

单点登陆本质上也是 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

OSS-client

跳转到OSS-client-1

跳转到OSS-client-2

复制代码

四、单点配置文件配置授权信息

由于我们要测试多应用间的单点,所以我们至少需要 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文档

  • 第一个要分享给大家的就是算法和数据结构

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 第二个就是数据库的高频知识点与性能优化

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 第三个则是并发编程(72个知识点学习)

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

与性能优化**

[外链图片转存中…(img-7NbaMlSq-1715345442418)]

  • 第三个则是并发编程(72个知识点学习)

[外链图片转存中…(img-dF00M3Ax-1715345442418)]

  • 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料

[外链图片转存中…(img-J9OGkOXn-1715345442418)]

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring SecurityJWT(JSON Web Token)是两个不同的概念和技术,但可以结合使用来实现单点登录Spring Security是一个强大的身份验证和访问控制框架,用于保护应用程序的安全性。它提供了一组功能丰富的工具和库,用于处理认证、授权和安全配置等方面的任务。 JWT是一种用于在网络应用中传递信息的开放标准(RFC 7519)。它由三部分组成:头部、载荷和签名。头部包含有关生成和验证JWT的元数据,载荷包含有关用户或其他实体的信息,签名用于验证JWT的完整性。 单点登录(SSO)是一种身份验证机制,允许用户使用一组凭据(例如用户名和密码)登录到一个系统后,即可无需再次输入凭据即可访问其他系统。 要实现基于Spring SecurityJWT单点登录,可以遵循以下步骤: 1. 用户成功登录到主系统(例如系统A),该系统生成并返回一个JWT给用户。 2. 用户尝试访问其他受保护的系统(例如系统B)时,在请求中包含JWT。 3. 系统B接收到请求后,使用公钥验证JWT的签名,并解析出用户信息。 4. 如果JWT验证成功且用户有权限访问系统B,则允许用户访问系统B。 需要注意的是,要实现真正的单点登录,还需要一个中心化的身份验证系统(例如OAuth2认证服务器),用于生成和验证JWT,并为不同的系统颁发相同的JWT。 此外,还可以使用Spring Security提供的一些配置来简化JWT的集成,例如自定义认证过滤器、授权管理器和认证提供者等。 总结起来,Spring SecurityJWT可以结合使用来实现单点登录Spring Security负责处理认证和授权,JWT用于传递用户信息和验证用户身份。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值