实战!微服务 认证中心 如何扩展授权模式 实现多种方式登录?

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 实战!微服务 认证中心 如何扩展授权模式 实现多种方式登录?

本篇文章介绍一下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的源码上更改了一版。

相关文章
|
15天前
|
存储 消息中间件 Apache
比较微服务中的分布式事务模式
比较微服务中的分布式事务模式
31 2
|
25天前
|
负载均衡 应用服务中间件 API
探索微服务架构中的API网关模式
在现代软件开发中,微服务架构已经成为一种流行的设计模式。它通过将复杂的应用程序分解为一组小的、松耦合的服务来简化开发和部署。然而,随着服务数量的增加,如何有效地管理这些服务之间的通信成为了一个挑战。API网关作为微服务架构的关键组件,提供了一个集中式的入口,用于处理客户端请求并将其路由到相应的服务。本文将深入探讨API网关的作用、实现方式以及如何在微服务架构中有效地利用它来优化系统性能和安全性。
33 0
|
13天前
|
负载均衡 前端开发 API
我希望在系统设计面试之前知道的 12 种微服务模式
我希望在系统设计面试之前知道的 12 种微服务模式
|
10天前
|
设计模式 监控 API
探索微服务架构中的API网关模式
在微服务的宇宙里,API网关是连接星辰的桥梁。它不仅管理着服务间的通信流量,还肩负着保护、增强和监控微服务集群的重任。本文将带你走进API网关的世界,了解其如何成为微服务架构中不可或缺的一环,以及它在实际应用中扮演的角色和面临的挑战。
|
17天前
|
负载均衡 监控 API
探索微服务架构中的API网关模式
在微服务架构的海洋中,API网关扮演着枢纽的角色。它不仅是客户端请求的接收者,也是各个微服务间通信的协调者。本文将深入探讨API网关的设计原则、实现策略以及它在微服务生态中的重要性。我们将通过实际案例分析,了解API网关如何优化系统性能、提高安全性和简化客户端与服务的交互。
37 4
|
21天前
|
负载均衡 监控 API
探索微服务架构中的API网关模式
【7月更文挑战第30天】在微服务架构的复杂网络中,API网关扮演着交通枢纽的角色,不仅简化了客户端与各微服务的交互,还提升了系统的安全性和可维护性。本文将深入探讨API网关的设计原则、核心功能以及在实际应用中的部署策略,旨在为后端开发者提供一套完整的API网关解决方案。
|
25天前
|
敏捷开发 消息中间件 中间件
深入理解微服务架构中的服务通信模式
【7月更文挑战第27天】在软件开发的世界中,微服务架构已经成为一种流行的设计范式,它通过将复杂的应用程序分解为一组小的、松耦合的服务来促进敏捷开发和可扩展性。然而,随之而来的是服务间通信的挑战。本文深入探讨了微服务架构中常用的服务通信模式,包括同步请求/响应、异步消息传递和事件驱动通信,并讨论了它们各自的优势与局限性。了解这些模式对于构建高效、可靠的分布式系统至关重要。
|
22天前
|
安全 前端开发 API
探索微服务架构中的API网关模式
【7月更文挑战第30天】在微服务架构的海洋中,API网关是一艘至关重要的航船。它不仅是服务的入口,更是流量控制、安全认证与协议转换的枢纽。本文将深入探讨API网关的核心作用,揭示其在微服务生态中的价值,并指导如何有效实现和部署这一关键组件。
53 6
|
18天前
|
运维 负载均衡 监控
探索微服务架构中的API网关模式
在当今分布式系统和微服务架构日益盛行的背景下,API网关作为一种重要的设计模式,承担着请求路由、负载均衡、认证授权、监控统计等关键职责。本文将深入探讨API网关在微服务架构中的作用,分析其实现机制,以及如何在实际应用中高效地部署和管理API网关,从而提升系统的可扩展性、安全性和可维护性。
21 2

热门文章

最新文章