vue+springboot前后端分离对接单点登录

本来我们自己是有一套登录系统的,且一直在线上使用!但公司要求登录统一对接集团的单点登录,且时间很急!由于之前没有相关经验,睬了很多坑,所以记录一下!

开始理一下流程,首先通过域名访问项目,首先进的是登录页,这个是nginx的配置,在进登录页挂载之前我先请求了一个后端接口

这个beforeMount函数是在进页面之前就请求的函数, 这时候到了后端接口,接口是啥不重要,但是都会先经过这个过滤器,下面是过滤器具体实现代码

代码比较长,大致的流程是判断当前单点登录的session是否为空,如果是空且本地的Shiro信息为空跳到单点登录地址!这个地址包括了登录成功的回调地址,我这边回调地址给了个特殊标识logincas,就是在单点登录后进入我们系统我们自己也要模拟登陆,因为我们是前后端分离项目,鉴权的逻辑在前端,单点登录完之后我们本地模拟登陆,返回前端用户的菜单和按钮信息,以及我们本地也要执行Shiro的认证,后续根据Shiro获取当前登录人的信息,这边单点登录完之后单点登录返回给我们的是一个userId, 这个在request里就可以获取,后续我们系统的处理参考如下面代码

 

此时单点登录已经成功了,后续就是我们自己系统的流程! 单点登出的流程很简单,就是把单点登录的session置为空,本地的Shiro信息登出,然后跳转到单点登出地址, 代码如下

好了,现在整个流程已经结束!这是正常情况,但是在做的过程中还是遇到了不少问题,就是在单点登录完之后这个单点登录的session不是共享的,这个项目我们的后台有多个服务,A服务登录了访问B服务的接口也是会跳到单点登录页面,我这边改进的是通过request的请求头来判断,在我们本地Shiro登录完之后,会给一个客户端Cookie且名字是ylmsSessionId,后面接口访问浏览器都会带上这个Cookie来访问的,我是根据这个来判断是否已经登录过,上面代码有! 另一个问题是我们本地登录Shiro有效期是30分钟,单点登录过期时间是2小时,也就是Shiro失效我们也要跳单点登录页面!我这边Shiro的信息失效会跳转一个默认接口,在接口返回相应的状态码及路径,前端一个拦截器根据相应的状态码跳转路径,代码如下