利用Cookie和token实现不同域名的单点登录(CAS)

1、不同域名实现单点登录。例如2个不同域名,a1.com和a2.com,因为浏览器中只能发送相同域名下的cookie(访问a1.com时只能发送a1.com下的cookie,如果cookie的域名被设置为a2.com就不能发送给a.com的服务器),所以利用cookie加session的方法不能实现单点登录,那么只能另想办法了。

2、利用第3个域名实现单点登录,这个域名就是CAS(中央认证系统),假设这个域名为cas.com。

3、实现原理

场景1:
  用户未登录(浏览器中没有CAS的cookie),访问敏感资源,例如...../admin/order,因为RUL中没有token请求参数,所以重定向到CAS的login/login Servlet, URL参数中带有用户访问的URL。
  用户浏览器访问CAS的login/login Servlet,因为没有token的cookie,所以重定向到CAS的login.jsp页面,URL参数中带有用户访问的URL。
  用户浏览器访问CAS的login.jsp页面,URL参数中带有用户访问的URL,填写完用户名、密码后,浏览器访问CAS的login Servlet。
  CAS的login Servlet验证用户名密码,如果成功,那么生成token,并写入cookie,然后重定向到用户实际想要访问的URL,URL参数中带有token。
  用户浏览器访问用户实际想要访问的URL,因为URL带有token,所以filter去CAS的login/login Servlet验证token,如果验证成功,那么返回用户实际想要访问的URL的内容。
  如果验证失败(例如登录过期,用户自己在URL中加的token,都会导致验证失败),那么就和URL中没有token请求参数一样,重定向到login/login Servlet,URL参数中带有用户访问的URL。
  用户浏览器访问CAS的login/login Servlet,虽然URL中带有token,但是验证时失败了(和CAS的authentication Servlet验证方法一样,所以也是失败),访问CAS的login.jsp页面。
场景2:
  用户已经在a1域名登录,这时访问了a2域名,那么必须知道用户已经登录了,否则就不能称为单点登录了。
  URL中没有token参数,所以AuthenticationFilter重定向到CAS的login/login Servlet。
  CAS的login/login Servlet检查token的cookie,取出token,验证token,验证通道重定向到用户想要访问的URL(带有token参数)。
  浏览器访问a2域名中中用户想要访问的URL(带有token参数),AuthenticationFilter校验token,校验通道放行,用户访问想要的资源。
场景3:
  用户直接访问CAS的login.jsp页面,验证用户名密码成功后,生成token的cookie,但是因为URL中没有rUrl参数,所以不进行重定向,只是显示用户基本信息。
场景4:
  用户登录成功后,访问敏感资源,例如../admin/user,没有token,所以跳转到CAS。浏览器访问CAS时,因为已经登录成功,所以会带着token的cookie,
  CAS通过cookie获取到token,验证token后,把用户重定向到../admin/user?token=xxxxxx,浏览器访问这个URL,服务器去CAS验证这个token

4、Java代码

https://pan.baidu.com/s/1KM9Ojj7tNsM7Hh-CLLD9WA提取码kTwY

posted @ 2020-12-28 10:09  carrot_hlb  阅读(2782)  评论(0编辑  收藏  举报