JavaWeb跨域单点登录

版权声明:原创文章转载请注明出处 https://blog.csdn.net/weixin_42686388/article/details/81299609

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校验登录成功之后,转发回到该URL2、后端设计权限控制方案的时候,做一个页面跟具体URL请求资源的映射关系,前端发起数据请求到后端,后端检验登录成功之后,根据映射关系转发到指定的页面;3、就TM规定,后端校验登录后只允许返回到主页;

退出操作流程:

        退出流程,可以有两种方案:1、由各个子系统收到数据请求的时候,实时去校验SSO的登录状态,如果发现SSO已经退出,则退出子系统;2A子系统退出后,通知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

 

参考资料:

 

 

猜你喜欢

转载自blog.csdn.net/weixin_42686388/article/details/81299609
今日推荐