SSO-单点登录理解及其解决方案

1.为什么要单点登录

    由于项目越来越大,大多项目开始拆分,如一个电商系统可以拆分成,用户系统(例如8080端口),订单系统(例如8085端口),支付系统(例如9091端口)等~甚至很多服务会进行拆分,会做SOA服务,会使用dubbo做微服务,或者简单的小型分布式,这样在服务与服务之间,或者系统与系统之间都是通过HTTP或者restful来进行通信的

     同一个大项目中,应该只登录一次,就能访问各个拆分的项目;(通过用户名密码登录用户系统,同时也能访问订单系统和支付系统,无需重新登录);

    在以往的单系统应用中,我们都是把user存入session中的,需要用到的时候随时取,如果取不到就跳转到登录注册页面,非常简单的原理;但是在现如今的分布式应用中,如何保证session同步呢?

比如订单服务是在order.jd.com;购物车服务在 cart.jd.com;

那么这2个二级域名下的用户信息如何实现同步呢?

2. 解决方案:

         一般通过SSO单点登录的方式达到该效果,保证一个账户在多个系统上实现单一用户的登录;

    自行开发一套单点登录系统(SSO),比如就使用 sso.jd.com,可以在这个二级域名下进行登录和注册,登录和注册都是以restful形式,为了可以同时提供给cms以及手机端的支持;

      登陆后把用户的相关信息存入redis,redis设置好过期时间,key为一个token,使用uuid,uuid生成后需要存入cookie中,失效时间随意定,但是再登录后需要重置redis和cookie中的失效时间;

       具体实现:通过spring-session实现。在springmvc中配置,在pom文件中添加依赖,在web.xml中添加过滤器配置;

3.重点:session的存储方案

1)多台tomcat(中间件)---可以直接理解为多台服务器存储session,通过ip-hash算法实现大致的负载均衡;(不安全)

2)多台tomcat(中间件)---每一台都相互连接,复制,保证数据不会丢失;

3)分散到多个tomcat(中间件)通过hash分散,并将所有的session数据存入redis集群;(常用)

猜你喜欢

转载自blog.csdn.net/qq_33999844/article/details/81772227