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

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

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

相关文章
|
7月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1161 3
|
5月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
5月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
1044 2
Spring Boot 3.x 微服务架构实战指南
|
9月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
530 102
|
12月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
592 0
|
7月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
759 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
12月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——MongoTemplate实现评论点赞
本节介绍如何使用MongoTemplate实现评论点赞功能。传统方法通过查询整个文档并更新所有字段,效率较低。为优化性能,采用MongoTemplate对特定字段直接操作。代码中展示了如何利用`Query`和`Update`对象构建更新逻辑,通过`update.inc("likenum")`实现点赞数递增。测试用例验证了功能的正确性,确保点赞数成功加1。
252 0
|
9月前
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
762 9
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
783 6
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
401 1