B/S架构前后端分离项目实现跨域单点登录方案设计
项目需求:
1、前后端分离项目,由后端实现会话管理,同时校验用户权限;
2、多个项目单点登录,允许跨域访问;
3、预留CS架构客户端点击按钮打开浏览器免登录接口;
项目框架:
前端项目:html静态页面;前后端分离;
后端项目:javaweb项目,使用maven搭建的SSM项目,集成shiro权限控制,使用redis缓存会话及用户权限;
认证中心:javaweb项目,使用maven搭建的SSM项目,使用转发方式实现SSO;当前方案未前后端分离,使用redis缓存会话;
设计思路:
1、使用请求转发的方式实现单点登录;
2、用户浏览器打开页面,由后端拦截数据请求校验登录状态,转发到SSO系统去登录,登录成功返回一个令牌,后端拿到令牌之后去SSO系统校验,校验通过则判定已经登录,根据令牌生成自己的会话信息;
3、即相当于,打开浏览器访问A系统,其实是到SSO系统登录,然后SSO系统告诉A系统用户已经登录,A系统就创建自己的会话信息,返回浏览器端请求的数据;此时再访问B系统,由于SSO系统已经登录,所以SSO系统就直接告诉B系统用户已经登录,不需要重新登录,B系统直接创建自己的会话信息即可;
方案设计流程:
打开页面登录校验流程:
该流程图是以主页举例说明,常用的应用场景: 微信公众号点击菜单进入系统,C/S架构客户端点击按钮打开系统(如:QQ面板打开QQ空间按钮,打开空间网页直接免登陆);
实现会话过期后,刷新页面重新登录,回到登录前页面,有几个方案:1、前段发起数据请求到后端的时候,携带当前页面的URL,后端Filter校验登录成功之后,转发回到该URL;2、后端设计权限控制方案的时候,做一个页面跟具体URL请求资源的映射关系,前端发起数据请求到后端,后端检验登录成功之后,根据映射关系转发到指定的页面;3、就TM规定,后端校验登录后只允许返回到主页;
退出操作流程:
退出流程,可以有两种方案:1、由各个子系统收到数据请求的时候,实时去校验SSO的登录状态,如果发现SSO已经退出,则退出子系统;2、A子系统退出后,通知SSO系统退出,然后由SSO告诉所有子系统,已经退出,这个操作要现在SSO注册子系统,记录所有子系统的退出请求路径;
当然两种方案结合使用也是可以的,不同的方案对SSO服务器的要求不一样而已;
编码实现:
1、 整体代码结构:
client即子系统,使用的时候,部署到多个端口,模拟多个系统单点登录;
server即SSO认证中心,client的登录认证就发到这里校验
2、 client端代码:
client端,集成了shiro的权限控制,校验登录信息,使用的shiro的自定义过滤器;重点也就在这个过滤器:
配置shiro的自定义过滤器:
3、server端代码
服务端的代码,比较简单,就是做一个登录页面,登录接口,退出接口、令牌校验登录状态接口;暂时就先不贴了吧;
模拟测试:
修改host文件,模拟多个客户端
127.0.0.1 sso.server.com
127.0.0.1 sso.client1.com
127.0.0.1 sso.client2.com
或者部署多个tomcat,使用不同端口
测试登录
打开浏览器,输入地址:http://sso.client1.com:8080/sso-client-web/index,然后将跳转到认证中心的登录页面,因为我上面过滤器配置的是IP地址,所以这里直接跳转到本地地址了:
同一个浏览器,打开新的标签页:http://sso.client2.com:8080/sso-client-web/index,同样跳转sso的登录页面:
在client1窗口跳转的页面,登录:
在client2窗口页面刷新,或者重新打开标签页:
该示例,没有模拟前后端分离的操作,但是实际上是一样的,将跳转jsp页面的代码,修改为跳转到前段的页面即可。
代码下载:
https://download.csdn.net/download/weixin_42686388/10586210
参考资料: