关于spring-cloud:Spring-Security-OAuth20-自定义授权模式

32次阅读

共计 3125 个字符,预计需要花费 8 分钟才能阅读完成。

大家好,我是不才陈某~

这是《Spring Cloud 进阶》第 24 篇文章,往期文章如下:

  • 五十五张图通知你微服务的灵魂摆渡者 Nacos 到底有多强?
  • openFeign 夺命连环 9 问,这谁受得了?
  • 阿里面试这样问:Nacos、Apollo、Config 配置核心如何选型?这 10 个维度通知你!
  • 阿里面试败北:5 种微服务注册核心如何选型?这几个维度通知你!
  • 阿里限流神器 Sentinel 夺命连环 17 问?
  • 比照 7 种分布式事务计划,还是偏爱阿里开源的 Seata,真香!(原理 + 实战)
  • Spring Cloud Gateway 夺命连环 10 问?
  • Spring Cloud Gateway 整合阿里 Sentinel 网关限流实战!
  • 分布式链路追踪之 Spring Cloud Sleuth 夺命连环 9 问?
  • 链路追踪自从用了 SkyWalking,睡的真香!
  • 3 本书了,7 万 + 字,10 篇文章,《Spring Cloud 进阶》根底版 PDF
  • 妹子始终没搞懂 OAuth2.0,明天整合 Spring Cloud Security 一次说明确!
  • OAuth2.0 实战!应用 JWT 令牌认证!
  • OAuth2.0 实战!玩转认证、资源服务异样自定义这些骚操作!
  • 实战干货!Spring Cloud Gateway 整合 OAuth2.0 实现分布式对立认证受权!
  • 字节面试这样问:跨库多表存在大量数据依赖问题有哪些解决方案?
  • 实战!退出登录时如何借助外力使 JWT 令牌生效?
  • 实战!Spring Cloud Gateway 集成 RBAC 权限模型实现动静权限管制!
  • 实战!阿里神器 Seata 实现 TCC 模式 解决分布式事务,真香!
  • 实战!openFeign 如何实现全链路 JWT 令牌信息不失落?
  • 微服务下蓝绿公布、滚动公布、灰度公布等计划,必须懂!
  • 微服务如何聚合 API 文档?这波秀~
  • Spring Cloud 2021.0.1 正式公布,卷不动了~

本篇文章介绍一下 Spring Security 如何扩大新的受权类型,也是理论开发中十分重要的知识点。

目录如下:

为什么须要自定义受权类型?

后面介绍 OAuth2.0 的根底知识点时介绍过反对的 4 种受权类型,别离如下:

  • 受权码模式
  • 简化模式
  • 客户端模式
  • 明码模式

对于上述 4 种受权类型不分明的,能够看之前的文章:妹子始终没搞懂 OAuth2.0,明天整合 Spring Cloud Security 一次说明确!

理论生产中上述四种受权类型基本不够用,比方常见的受权类型如下:

  • 微信认证
  • QQ 认证
  • 手机号 + 验证码认证
  • 图形验证码认证
  • 邮箱认证

因而咱们必须懂得 OAuth2.0 如何自定义受权类型,这也是本篇文章的重点。

实现思路

Spring Security 定制受权类型其实很简略,次要是把握其中的思路,上面是明码模式的受权流程,如下图:

根据上述流程图能够跟着源码进去看看,不难发现有几个如下重要点:

  • 每种受权类型都对应一个实现类TokenGranter,其中定义着受权类型
  • 所有 TokenGranter 实现类都通过 CompositeTokenGranter 中的 tokenGranters 汇合存起来。
  • 而后通过判断 grantType 参数来定位具体应用那个 TokenGranter 实现类来解决受权。
  • 每种受权形式都对应一个AuthenticationProvider
  • TokenGranter 类会 new 一个 AuthenticationToken实现类,如 UsernamePasswordAuthenticationToken 传给 ProviderManager 类。

因而想要自定义一个受权类型,必须构建本人的TokenGranterAuthenticationProviderAuthenticationToken

代码实现

上面就以 手机号 + 明码 的登录形式定义一个类型:mobile_pwd,剩下的本人照葫芦画瓢。

1、自定义 UserDetailService

这个和明码受权类型相似,要实现一个办法从数据库中依据手机号查问用户的详细信息。

定义一个 SmsCodeUserDetailService 接口如下:

次要就是一个 loadUserByMobile() 办法,实现类如下:

2、自定义 AuthenticationToken

相似于明码模式的中 UsernamePasswordAuthenticationToken,自定义一个MobilePasswordAuthenticationToken 封装手机号和明码,如下:

3、自定义 TokenGranter

每种受权类型都对应一种 TokenGranter,其中会定义受权类型的名称,比方明码模式的ResourceOwnerPasswordTokenGranter,其中的 GRANT_TYPE 为 password。

自定义一个MobilePwdGranter,照葫芦画瓢,模拟着改改,代码如下:

4、自定义 AuthenticationProvider

这个类就是真正的解决类,通过 TokenGranter 后,会找到对应的 AuthenticationProvider,而后取出参数从数据库(UserDetailService)中查问对应的信息进行匹配。

自定义MobilePasswordAuthenticationProvider,代码如下:

案例源码已上传 GitHub,关注公众号:码猿技术专栏,回复要害:9529 获取!

5、将自定义的 MobilePasswordAuthenticationProvider 注入 IOC 容器

这里必须将自定义的 MobilePasswordAuthenticationProvider 注入到 IOC 容器,如果不注入,会报找不到能解决的 AuthenticationProvider 这个异样。

新建SmsCodeSecurityConfig,代码如下:

留神:因为应用的内部配置,因而必须在全局配置中指定

6、Security 的全局配置指定 SmsCodeSecurityConfig

因为是离开配置,因而必须在全局配置中指定才会失效,代码如下:

7、加到 CompositeTokenGranter 汇合中

须要将自定义的受权类型加到汇合 CompositeTokenGranter 中,此处须要批改认证核心的配置类(AuthorizationServerConfig)中的代码,如下:

8、oauth_client_details 表中增加受权类型

oauth_client_details这个表是存储客户端的详细信息的,须要在对应的客户端资源那一行中的 authorized_grant_types 这个字段中增加自定义的受权类型,多个用逗号分隔。

测试

通过上述的步骤曾经配置实现,上面来测试,启动服务,申请如下:

源码获取

受权类型次要是针对 认证核心(oauth2-cloud-auth-server) 的改变,改变的目录如下:

陈某间接在之前网关整合 Spring Security 的源码上更改了一版。

案例源码已上传 GitHub,关注公众号:码猿技术专栏,回复要害:9529 获取!

最初说一句(别白嫖,求关注)

陈某每一篇文章都是精心输入,曾经写了 3 个专栏,整顿成PDF,获取形式如下:

  1. 《Spring Cloud 进阶》PDF:关注公众号:【码猿技术专栏】回复关键词 Spring Cloud 进阶 获取!
  2. 《Spring Boot 进阶》PDF:关注公众号:【码猿技术专栏】回复关键词 Spring Boot 进阶 获取!
  3. 《Mybatis 进阶》PDF:关注公众号:【码猿技术专栏】回复关键词 Mybatis 进阶 获取!

如果这篇文章对你有所帮忙,或者有所启发的话,帮忙 点赞 在看 转发 珍藏,你的反对就是我坚持下去的最大能源!

关注公众号:【码猿技术专栏】,公众号内有超赞的粉丝福利,回复:加群,能够退出技术探讨群,和大家一起探讨技术,吹牛逼!

正文完
 0