分布式系统统一登录模块设计

维基百科对于单点登录的定义:

    单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一退出(single sign-off)就是指,只需要单一的退出动作,就可以结束对于多个系统的访问权限。

 

    web 工程在做系统登录的时候一般会把登录请求交给 controller 处理,根据用户传递过来的用户名和密码作为查询条件去数据库中查询对应信息,如果数据符合要求,就会把用户信息放到 session 中维持会话(由于 HTTP 的无状态性)。用户在进行一些需要登录才允许的操作时,系统会到 session 中进行判断用户是否登录。

 

    如果业务量大了,一台服务器不能满足需求,需要扩容,那么不同的服务器是需要共享 session 的,不然每台服务器都维护各自不同的 session,可能会导致因为反向代理处理负载均衡导致的重复登录问题,用户体验不好。

 

    但是如果只是简单的使用广播对每台服务器上的 session 进行同步的话,比较耗费资源,性能也不好。

 

    于是做一个单点登录系统来专门处理这个事情就很有意义了。将 session 全部存放到 Redis 中,Redis 全局管理数据,因为独特的 key 过期时间特性,对应 session 的过期特性,也很般配。另外,Redis 比较轻量,性能也很好。

 

    用户在登录的时候如果通过鉴权体系的鉴定,可以生成 Token 数据,以 Token 作为键名,用户登录信息作为值,写入到 Redis 中,设置过期时间,并将 Token 写入 cookie 中。用户下次进行敏感操作的时候,通过拦截器判断用户请求头中 cookie 的 token 字段是否能在 Redis 中查询到数据。如果能查询到,就允许用户进行操作并刷新登录有效期,否则就返回登录 URL,这样一个分布式系统的单点登录系统就实现了。  

你可能感兴趣的:(分布式系统统一登录模块设计)