当前位置: 首页 > 科技观察

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

时间:2023-03-16 23:34:44 科技观察

目录如下:为什么要自定义授权类型?在介绍OAuth2.0的基础知识点时,介绍了四种支持的授权类型,分别是:授权码模式简化模式客户端模式密码模式以上四种在实际生产中一种授权类型是不够的。比如常见的授权类型有:微信认证、QQ认证、手机号+验证码认证、图形验证码认证、邮箱认证,所以我们一定要了解OAuth2.0是如何自定义授权类型的,这也是本文的重点。实现思路SpringSecurity的自定义授权类型其实很简单。主要是掌握思路。下面是密码模式的授权流程,如下图所示:根据上面的流程图,大家可以跟着源码看看。不难发现几个重点:每一种授权类型对应一个实现类TokenGranter,它定义了授权类型。所有的TokenGranter实现类都是通过CompositeTokenGranter中的tokenGranters集合来保存的。然后通过判断grantType参数定位到TokenGranter实现类来处理授权。每个授权方式对应一个AuthenticationProvider。TokenGranter类会新建一个AuthenticationToken实现类,比如UsernamePasswordAuthenticationToken,传递给ProviderManager类。因此,如果你想自定义一个授权类型,你必须构建自己的TokenGranter、AuthenticationProvider和AuthenticationToken。代码实现下面定义一个类型:mobile_pwd,登录方式为手机号+密码,剩下的自己做。1.自定义UserDetailService这个类似于密码授权类型。需要实现一种根据手机号码从数据库中查询用户详细信息的方法。定义一个SmsCodeUserDetailService接口如下:主要是一个loadUserByMobile()方法,实现类如下:2、自定义AuthenticationToken类似于密码方式的UsernamePasswordAuthenticationToken,自定义一个MobilePasswordAuthenticationToken封装手机号和密码,如下:3.为每个类型自定义TokenGranter每个授权类型对应一个TokenGranter,定义了授权类型的名称,如密码模式下的ResourceOwnerPasswordTokenGranter,其中GRANT_TYPE为密码。自定义一个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表中添加授权类型。用户定义的授权类型,以逗号分隔。经过以上步骤测试已经配置完成。让我们测试并启动服务。请求如下:源码获取授权类型,主要是对认证中心(oauth2-cloud-auth-server)的改动。改动后的目录如下:Chen直接将之前集成SpringSecurity的网关源码改成了新版本。