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

本篇文章介绍一下Spring Security如何扩展新的授权类型,也是实际开发中非常重要的知识点。

本篇文章介绍一下Spring Security如何扩展新的授权类型,也是实际开发中非常重要的知识点。

目录如下:

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

为什么需要自定义授权类型?

前面介绍OAuth2.0的基础知识点时介绍过支持的4种授权类型,分别如下:

  • 授权码模式
  • 简化模式
  • 客户端模式
  • 密码模式

实际生产中上述四种授权类型根本不够用,比如常见的授权类型如下:

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

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

实现思路

Spring Security 定制授权类型其实很简单,主要是掌握其中的思路,下面是密码模式的授权流程,如下图:

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

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

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

因此想要自定义一个授权类型,必须构建自己的TokenGranter、AuthenticationProvider、AuthenticationToken。

代码实现

下面就以手机号+密码的登录方式定义一个类型:mobile_pwd,剩下的自己照葫芦画瓢。

1、自定义UserDetailService

这个和密码授权类型类似,要实现一个方法从数据库中根据手机号查询用户的详细信息。

定义一个SmsCodeUserDetailService接口如下:

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

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

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

2、自定义AuthenticationToken

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

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

3、自定义TokenGranter

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

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

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

4、自定义AuthenticationProvider

这个类就是真正的处理类,经过TokenGranter后,会找到对应的AuthenticationProvider,然后取出参数从数据库(UserDetailService)中查询对应的信息进行匹配。

自定义MobilePasswordAuthenticationProvider,代码如下:

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

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

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的源码上更改了一版。

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月5日 22:50
下一篇 2023年5月5日 22:50

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信