大家好,我是不才陈某~ 这是《Spring Cloud 进阶》第24篇文章,往期文章如下:
本篇文章介绍一下Spring Security如何扩展新的授权类型,也是实际开发中非常重要的知识点。 目录如下: 为什么需要自定义授权类型?前面介绍OAuth2.0的基础知识点时介绍过支持的4种授权类型,分别如下:
关于上述4种授权类型不清楚的,可以看之前的文章:妹子始终没搞懂OAuth2.0,今天整合Spring Cloud Security 一次说明白! 实际生产中上述四种授权类型根本不够用,比如常见的授权类型如下:
因此我们必须懂得OAuth2.0如何自定义授权类型,这也是本篇文章的重点。 实现思路Spring Security 定制授权类型其实很简单,主要是掌握其中的思路,下面是密码模式的授权流程,如下图: 根据上述流程图可以跟着源码进去看看,不难发现有几个如下重要点:
因此想要自定义一个授权类型,必须构建自己的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的源码上更改了一版。 “ 如果这篇文章对你有所帮助,或者有所启发的话,帮忙点赞、在看、转发、收藏,你的支持就是我坚持下去的最大动力! |
|
来自: woh5r1ofyffxnh > 《待分类》