单点登陆需求在现代企业系统中是非常常见的一个需求,无论是ToC的系统,还是ToB的系统。
单点登陆(SSO,Single Sign On)的概念比较简单,就是多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

如果上图所示,有一个用户,三个应用系统,还有一个登陆系统(登陆模块)。如何在上述系统中间实现一个单点登陆呢?
首先假设只有用户和一个系统,我们怎么实现登陆呢?当用户第一次访问应用系统的时候,因为还没有登录,会被引导到登录页进行登录;根据用户提供的登录信息,系统进行身份校验(用户识别号+识别码(密码/验证码)),如果通过校验,应该返回给用户一个认证的凭据--ticket,同时应用系统会把这个ticket存储到自己的存储中(内存/redis/数据库);用户在客户端将这个ticket存储在客户端,如cookie,sessionStorage等。当用户再访问系统的时候将这个ticket带上(通过cookie或URL或request header等),作为自己认证的凭据,应用系统接受到请求之后会对这个ticket进行校验。如果通过校验,用户就可以继续访问应用系统了。
多个系统的时候真的要实现的时候也不是很复杂。当用户第一次访问应用系统A的时候,因为还没有登录,会被引导到登陆系统中进行登录;根据用户提供的登录信息,登陆系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到登陆系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统B和应用系统C了。
如果是web系统,这里还会有一个跨域的问题,登陆系统给用户的ticket只会存储在登陆系统的域里面,而应用系统A和登陆系统的域不是一个。所以当从登陆系统登陆以后再访问应用系统的时候需要做一次转换。这个时候登陆系统会要求应用系统提供自己redirectUrl,当用户在登陆成功以后,会跳转到这个redirectUrl,同时在这个URL上面添加ticket参数。
实际使用当中,登陆系统会要求应用系统给出更多的字段,以此来验证彼此的安全性。例如会又一个AppId和AppSecret。
网友评论