java技术---单点登录统一管理系统

1.单点登录英文全称Single Sign On,简称就是SSO
2.它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统

(1)有4个系统,分别是Application1、Application2、Application3、和SSO
(2)Application1、Application2、Application3没有登录模块,而SSO只有登录模块,没有其他的业务模块
(3)当Application1、Application2、Application3需要登录时,将跳到SSO系统
(4)SSO系统完成登录,其他的应用系统也就随之登录了

3.技术实现

(1)普通的登录认证机制     
       <1>在浏览器中访问一个应用,这个应用需要登录,填写完用户名和密码后,完成登录认证
       <2>在这个用户的session中标记登录状态为yes(已登录),同时在浏览器中写入Cookie
       <3>这个Cookie(自动存放sessionId)是这个用户的唯一标识,用来对应session
       <4>下次再访问同一个应用时,请求中会带上这个Cookie,服务端会根据这个Cookie找到对应的session,通过session来判断这个用户是否登录
       <5>如果不做特殊配置,这个Cookie的名字叫做jsessionid,值在服务端(server)是唯一的
(2)同域下的单点登录
        <1>一个企业一般情况下只有一个域名,通过二级域名区分不同的系统
        <2>比如有个域名叫做:a.com,同时有两个业务系统分别为:app1.a.com和app2.a.com   
        <3>要做单点登录(SSO),需要一个登录系统,叫做:sso.a.com
        <4>只要在sso.a.com登录,app1.a.com和app2.a.com就也登录了
        <5>其实是在sso.a.com的服务端的session中记录了登录状态,同时在浏览器端的sso.a.com下写入了Cookie  
(3)同域下的单点登录问题与处理
        <1>怎么才能让app1.a.com和app2.a.com登录呢:这里有两个问题
          1.Cookie是不能跨域的,Cookie的domain属性是sso.a.com,给app1.a.com和app2.a.com发送请求是带不上的
          2.so、app1和app2是不同的应用,它们的session存在自己的应用内,是不共享的
        <2>针对第一个问题
          1.sso登录以后,可以将Cookie的域设置为顶域,即.a.com
          2.这样所有子域的系统都可以访问到顶域的Cookie
          3.在设置Cookie时,只能设置顶域和自己的域,不能设置其他的域
           比如:我们不能在自己的系统中给baidu.com的域设置Cookie
        <3>针对第二个问题
          1.在sso系统登录了,这时再访问app1,Cookie也带到了app1的服务端(Server)
          2.app1的服务端怎么找到这个Cookie对应的Session,这里就要把3个系统的Session共享
          3.共享Session的解决方案有很多,例如:Spring-Session(这样第2个问题也解决了)  
(4)不同域下的单点登录
        <1>用户访问app系统,app系统是需要登录的,但用户现在没有登录
        <2>跳转到SSO登录系统,SSO系统也没有登录,弹出用户登录页
        <3>用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器中写入SSO域下的Cookie
        <4>SSO系统登录完成后会生成一个Service Ticket,然后跳转到app系统,同时将ST作为参数传递给app系统 
        <5>app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效(拦截器或者过滤器实现)
        <6>验证通过后,app系统将登录状态写入session并设置app域下的Cookie 
(5)不同域下的二次登录
        <1>用户访问app2系统,app2系统没有登录,跳转到SSO
        <2>由于SSO已经登录了,不需要重新登录认证
        <3>SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2
        <4>app2拿到ST,后台访问SSO,验证ST是否有效
        <5>验证成功后,app2将登录状态写入session,并在app2域下写入Cookie
        <6>这样,app2系统不需要走登录流程,就已经是登录了                       

4.总结:

(1)单点登录(SSO系统)是保障各业务系统的用户资源的安全
(2)单点登录,资源都在各个业务系统这边,不在SSO那一方
(3)用户在给SSO服务器提供了用户名密码后,作为业务系统并不知道这件事
(4)SSO给业务系统一个ST,业务系统是不能确定这个ST是用户伪造的,还是真的有效,要拿着这个ST去SSO服务器再问一下
(5)这个用户给SSO的ST是否有效,是有效的SSO才能让这个用户访问
发布了143 篇原创文章 · 获赞 10 · 访问量 7556

猜你喜欢

转载自blog.csdn.net/qq591009234/article/details/103578045