你了解单点登录吗?

单点登录

1、为什么需要单点登录?

  • 提高用户效率,用户不再被多次登录困扰,也不需要记住多个ID和密码。----例如进入一个网站,但是可能不同的服务是部署在不同的服务器上,如果没有单点登录,而是每个服务器都对用户的请求进行一次登录状态筛选,那么用户进入不同服务还有重新登录,这太奇怪了!有了单点登录就不用这样麻烦了。

  • 提高开发人员的效率。SSO(Single Sign On)为开发人员提供了一个通用的身份验证框架。

  • 简化管理。如果应用程序加入了单点登录协议,管理用户账号的负担就会减轻。

2、单点登录的来源

  • 早期的单机部署:web单系统应用

早期我们开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行。所有的功能,所有的业务都是由这一个war包来支持,这样的单应用,也称之为巨石应用,十分不好扩展和拆分。

在巨石应用下,用户的登录以及权限十分简单,用户登录完成后,把相关信息放入会话中,HTTP维护这个会话,在每次用户请求服务器的时候来验证这个会话即可 。这个登录会话就是session,维护了用户状态。

session.setAttribute("user",user);
session.getAttribute("user");
  • 分布式集群部署

由于网站的访问量越来越大,有了分布式部署。例如,如果引入集群的概念,一个单应用可能重新部署在3台tomcat以上服务器,使用nginx来实现反向代理,此时这个session无法在这3台tomcat上共享,用户信息会丢失,所以不得不考虑多服务器之间的session同步问题,这就是单点登录的来源。

3、单点登录

单点登录的实现方案,包括 Cookies,Session同步,分布式Session方式,目前的大型网站都是采用分布式Session的方式。

  • session广播机制实现

在一个集群中的一个模块登录后,然后把这个session复制n份,发送到这个集群的其他模块中,就实现了一处登录,处处可用。但缺点是耗费比较大,不推荐使用

  • 基于Cookie的单点登录

使用Cookie作为媒介,存放用户凭证,用户登录父应用之后,应用返回一个加密的cookie,当用户访问子应用的时候,携带上这个cookie,授权应用解密cookie并进行校验,校验通过则登录当前用户。cookie是客户端技术,保存在浏览器中,每次发送请求带着cookie值进行发送

缺点:

  • cookie不安全,将私密内容存储在客户端的cookie,不安全。如果cookie的加密算法泄露,攻击者通过伪造Cookie则可以伪造特定用户身份,非常危险
  • 不能跨域实现免登录

基于分布式session实现单独登录

  • 用户第一次登录时,将会话信息(token,按照一定规则生成的字符串,字符串中包含有用户信息,如用户id和用户信息 ),比如以用户id为key,写入分布式session
  • 用户再次访问时,查询分布式session,是否有会话信息,如果没有则跳转到登录页;有的话直接访问
  • 一般采用Cache中间件实现,建议使用Redis,因为它有持久化的功能,方便分布式session宕机后,可以从持久化存储中加载会话信息
  • 存入会话时,可以设置会话保持时间,比如15分钟,超过session就会失效

用户登录时,输入用户名密码等信息,验证数据库后,登录成功,将会话信息存入分布式session(redis中保存,设置过期时间)会返回ticket保存在cookie中,用户访问其他服务时携带cookie(其实主要是ticket),成功访问。

token是什么?

token就是按照一定规则生成字符串,字符串可以包含用户信息

你可能感兴趣的:(JavaWeb,java,web)