SpringCloud微服务中,如何实现JustAuth SpringSec的扩展与优化?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1325个文字,预计阅读时间需要6分钟。
前面我们详细介绍了SSO和OAuth2的定义和实现原理,并通过实例说明了如何在微服务框架中使用Spring Security OAuth2实现单点登录授权服务器和客户端端。目前,很多平台都提供了单点登录服务。
前面我们详细介绍了SSO、OAuth2的定义和实现原理,也举例说明了如何在微服务框架中使用spring-security-oauth2实现单点登录授权服务器和单点登录客户端。目前很多平台都提供了单点登录授权服务器功能,比如我们经常用到的QQ登录、微信登录、新浪微博登录、支付宝登录等等。
如果我们自己的系统需要调用第三方登录,那么我们就需要实现单点登录客户端,然后跟需要对接的平台调试登录SDK。JustAuth是第三方授权登录的工具类库,对接了国外内数十家第三方登录的SDK,我们在需要实现第三方登录时,只需要集成JustAuth工具包,然后配置即可实现第三方登录,省去了需要对接不同SDK的麻烦。
JustAuth官方提供了多种入门指南,集成使用非常方便。但是如果要贴合我们自有开发框架的业务需求,还是需要进行整合优化。下面根据我们的系统需求,从两方面进行整合:一是支持多租户功能,二是和自有系统的用户进行匹配。
- GitEgg多租户功能实现介绍
GitEgg框架支持多租户功能,从多租户的实现来讲,目前大多数平台都是在登录界面输入租户的标识来确定属于哪个租户,这种方式简单有效,但是对于用户来讲体验不是很好。我们更希望的多租户功能是能够让用户无感知,且每个租户有自己不同的界面展示。
GitEgg在实现多租户功能时,考虑到同一域名可以设置多个子域名,每个子域名可对应不同的租户。所以,对于多租户的识别方式,首先是根据浏览器当前访问的域名或IP地址和系统配置的多租户域名或IP地址信息进行自动识别,如果是域名或IP地址存在多个,或者未找到相关配置时,才会由用户自己选择属于哪个租户。
- 自定义JustAuth配置文件信息到数据库和缓存
在JustAuth的官方Demo中,SpringBoot集成JustAuth是将第三方授权信息配置在yml配置文件中的,对于单租户系统来说,可以这样配置。但是,对于多租户系统,我们需要考虑多种情况:一种是整个多租户系统使用同一套第三方授权,授权之后再由用户选择绑定到具体的租户;另外一种是每个租户配置自己的第三方授权,更具差异化。
出于功能完整性的考虑,我们两种情况都实现,当租户不配置自有的第三方登录参数时,使用的是系统默认自带的第三方登录参数。当租户配置了自有的第三方登录参数时,就是使用租户自己的第三方授权服务器。我们将JustAuth原本配置在yml配置文件中的第三方授权服务器信息配置在数据库中,并增加多租户标识,这样在不同租户调用第三方登录时就是相互隔离的。
首先我们通过JustAuth官方Demo justauth-spring-boot-starter-demo 了解到JustAuth主要的配置参数为:
- JustAuth功能启用开关
- 自定义第三方登录的配置信息
- 内置默认第三方登录的配置信息
- Http请求代理的配置信息
- 缓存的配置信息
justauth:
# JustAuth功能启用开关
enabled: true
# 自定义第三方登录的配置信息
extend:
enum-class: com.xkcoding.justauthspringbootstarterdemo.extend.ExtendSource
config:
TEST:
request-class: com.xkcoding.justauthspringbootstarterdemo.extend.ExtendTestRequest
client-id: xxxxxx
client-secret: xxxxxxxx
redirect-uri: oauth.xkcoding.com/demo/oauth/test/callback
MYGITLAB:
request-class: com.xkcoding.justauthspringbootstarterdemo.extend.ExtendMyGitlabRequest
client-id: xxxxxx
client-secret: xxxxxxxx
redirect-uri: localhost:8443/oauth/mygitlab/callback
# 内置默认第三方登录的配置信息
type:
GOOGLE:
client-id: xxxxxx
client-secret: xxxxxxxx
redirect-uri: localhost:8443/oauth/google/callback
ignore-check-state: false
scopes:
- profile
- email
- openid
# Http请求代理的配置信息
192.168.0.2:8000/social/github/callback
ignore-check-state: false
- 或者使用多租户系统配置 ,每个租户仅允许有一个主配置
2、登录页添加Github登录链接
<div class="user-login-other">
<span>{{ $t('user.login.sign-in-with') }}</span>
<a @click="openSocialLogin('wechat_open')">
<a-icon class="item-icon"
type="wechat"></a-icon>
</a>
<a @click="openSocialLogin('qq')">
<a-icon class="item-icon"
type="qq"></a-icon>
</a>
<a @click="openSocialLogin('github')">
<a-icon class="item-icon"
type="github"></a-icon>
</a>
<a @click="openSocialLogin('dingtalk')">
<a-icon class="item-icon"
type="dingding"></a-icon>
</a>
<a class="register"
@click="openRegister"
>{{ $t('user.login.signup') }}
</a>
</div>
3、点击登录,如果此时GitHub账号没有登录过,则跳转到绑定或者注册账号界面
4、输入手机号+验证码或者账号+密码,即可进入到登录前的页面。使用手机号+验证码的模式,如果系统不存在账号,可以直接注册新账号并登录。
5、JustAuth支持的第三方登录列表,只需到相应第三方登录申请即可,下面图片取自JustAuth官网:
Gitee: gitee.com/wmz1930/GitEgg
GitHub: github.com/wmz1930/GitEgg
本文共计1325个文字,预计阅读时间需要6分钟。
前面我们详细介绍了SSO和OAuth2的定义和实现原理,并通过实例说明了如何在微服务框架中使用Spring Security OAuth2实现单点登录授权服务器和客户端端。目前,很多平台都提供了单点登录服务。
前面我们详细介绍了SSO、OAuth2的定义和实现原理,也举例说明了如何在微服务框架中使用spring-security-oauth2实现单点登录授权服务器和单点登录客户端。目前很多平台都提供了单点登录授权服务器功能,比如我们经常用到的QQ登录、微信登录、新浪微博登录、支付宝登录等等。
如果我们自己的系统需要调用第三方登录,那么我们就需要实现单点登录客户端,然后跟需要对接的平台调试登录SDK。JustAuth是第三方授权登录的工具类库,对接了国外内数十家第三方登录的SDK,我们在需要实现第三方登录时,只需要集成JustAuth工具包,然后配置即可实现第三方登录,省去了需要对接不同SDK的麻烦。
JustAuth官方提供了多种入门指南,集成使用非常方便。但是如果要贴合我们自有开发框架的业务需求,还是需要进行整合优化。下面根据我们的系统需求,从两方面进行整合:一是支持多租户功能,二是和自有系统的用户进行匹配。
- GitEgg多租户功能实现介绍
GitEgg框架支持多租户功能,从多租户的实现来讲,目前大多数平台都是在登录界面输入租户的标识来确定属于哪个租户,这种方式简单有效,但是对于用户来讲体验不是很好。我们更希望的多租户功能是能够让用户无感知,且每个租户有自己不同的界面展示。
GitEgg在实现多租户功能时,考虑到同一域名可以设置多个子域名,每个子域名可对应不同的租户。所以,对于多租户的识别方式,首先是根据浏览器当前访问的域名或IP地址和系统配置的多租户域名或IP地址信息进行自动识别,如果是域名或IP地址存在多个,或者未找到相关配置时,才会由用户自己选择属于哪个租户。
- 自定义JustAuth配置文件信息到数据库和缓存
在JustAuth的官方Demo中,SpringBoot集成JustAuth是将第三方授权信息配置在yml配置文件中的,对于单租户系统来说,可以这样配置。但是,对于多租户系统,我们需要考虑多种情况:一种是整个多租户系统使用同一套第三方授权,授权之后再由用户选择绑定到具体的租户;另外一种是每个租户配置自己的第三方授权,更具差异化。
出于功能完整性的考虑,我们两种情况都实现,当租户不配置自有的第三方登录参数时,使用的是系统默认自带的第三方登录参数。当租户配置了自有的第三方登录参数时,就是使用租户自己的第三方授权服务器。我们将JustAuth原本配置在yml配置文件中的第三方授权服务器信息配置在数据库中,并增加多租户标识,这样在不同租户调用第三方登录时就是相互隔离的。
首先我们通过JustAuth官方Demo justauth-spring-boot-starter-demo 了解到JustAuth主要的配置参数为:
- JustAuth功能启用开关
- 自定义第三方登录的配置信息
- 内置默认第三方登录的配置信息
- Http请求代理的配置信息
- 缓存的配置信息
justauth:
# JustAuth功能启用开关
enabled: true
# 自定义第三方登录的配置信息
extend:
enum-class: com.xkcoding.justauthspringbootstarterdemo.extend.ExtendSource
config:
TEST:
request-class: com.xkcoding.justauthspringbootstarterdemo.extend.ExtendTestRequest
client-id: xxxxxx
client-secret: xxxxxxxx
redirect-uri: oauth.xkcoding.com/demo/oauth/test/callback
MYGITLAB:
request-class: com.xkcoding.justauthspringbootstarterdemo.extend.ExtendMyGitlabRequest
client-id: xxxxxx
client-secret: xxxxxxxx
redirect-uri: localhost:8443/oauth/mygitlab/callback
# 内置默认第三方登录的配置信息
type:
GOOGLE:
client-id: xxxxxx
client-secret: xxxxxxxx
redirect-uri: localhost:8443/oauth/google/callback
ignore-check-state: false
scopes:
- profile
- email
- openid
# Http请求代理的配置信息
192.168.0.2:8000/social/github/callback
ignore-check-state: false
- 或者使用多租户系统配置 ,每个租户仅允许有一个主配置
2、登录页添加Github登录链接
<div class="user-login-other">
<span>{{ $t('user.login.sign-in-with') }}</span>
<a @click="openSocialLogin('wechat_open')">
<a-icon class="item-icon"
type="wechat"></a-icon>
</a>
<a @click="openSocialLogin('qq')">
<a-icon class="item-icon"
type="qq"></a-icon>
</a>
<a @click="openSocialLogin('github')">
<a-icon class="item-icon"
type="github"></a-icon>
</a>
<a @click="openSocialLogin('dingtalk')">
<a-icon class="item-icon"
type="dingding"></a-icon>
</a>
<a class="register"
@click="openRegister"
>{{ $t('user.login.signup') }}
</a>
</div>
3、点击登录,如果此时GitHub账号没有登录过,则跳转到绑定或者注册账号界面
4、输入手机号+验证码或者账号+密码,即可进入到登录前的页面。使用手机号+验证码的模式,如果系统不存在账号,可以直接注册新账号并登录。
5、JustAuth支持的第三方登录列表,只需到相应第三方登录申请即可,下面图片取自JustAuth官网:
Gitee: gitee.com/wmz1930/GitEgg
GitHub: github.com/wmz1930/GitEgg

