1.1 简介

trsso-web,单点登录,作为一个登录认证系统,提供多个web 应用之间的登录认证。在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

1.2 登录登出

1.2.1 登录时序图

步骤详解:

  • 第四步中,访问SSO的请求中,站点的返回地址参数名称为 service。例如:https://passport.z-trip.cn/login?service=https://www.z-trip.cn/home/index.html。
  • 第七步中,请求登录页面进行登录操作,也会带上站点的service参数。
  • 第八步中,会生成两个 cookie,一个是用SSO 的key 加密生成的KI4SO_SERVER_EC, 一个是应用的key 生成的KI4SO_CLIENT_EC。
  • 第九步中,使用第八步生成的KI4SO_CLIENT_EC 当做请求参数,去请求登录,会经过 AppFilter, filter 会去SSO 认证凭证。
  • 第十步中,设置定义用户状态cookie (st),st 默认有30分钟过期时间。用来标识回话超时,自动登录。
  • 第十一步中,访问页面带上 st, st过期将会登录,st不过期,访问成功。
1.2.2 单点登录

应用A 在登录成功后,SSO会生成自己站点的cookie(ServerEc),应用B 在登录时,会从SSO 站点的cookie中解析出自己的登录凭证,从而实现登录。单点登录的请求过程,本质上是省略了 登录时序图 中的 步骤(5,6,7),因为在步骤四中,可以拿到 SSO 的 ServiceEc。

1.2.3 登出时序图

1.3 源码解析

用户登录过程大致分为以下三个步骤,首先由 凭据解析器(CredentialResolver) 来生成凭据,然后用 认证管理器(AuthenticationManager) 来负责对用户凭据进行有效性认证,并将认证结果生成加密的凭证。最后用加密的验证 clientEc 去请求登录。

1.3.1 凭证解析器 CredentialResolver

凭证解析器的类继承实现关系如下

​ 从http请求参数的cookie或者参数值中解析出凭据信息对象,返回解析后的凭据对象。该凭证解析器使用了结构型设计模式的 组合模式,组件(CredentialResolver),组合类(CompositeCredentialResolver),叶子类EncryCredentialResolver(从cookie中解析凭证), AutoLoginCredentialResolver(自动登录解析凭证),UsernamePasswordCredentialResolver(用户名密码解析凭证)。组合类为组件的默认调用实现,组合类包括多个叶子类,叶子类负责实现对不同凭证解析器的具体操作。组合类中调用叶子类,直到生成凭证。如果你要实现自己的具体叶子类,请实现CredentialResolver, 并且加入到组合类即可。

  • EncryCredentialResolver

    经过认证加密后的凭据信息解析器,从http请求的cookie中解析出对应的加密后的凭据信息。

  • AutoLoginCredentialResolver

    自动登录凭证解析器,从http 参数中解析出 alp、userId、clientTime。

  • UsernamePasswordCredentialResolver

    用户名和密码凭据解析器,从参数中解析出用户的用户名和密码信息。

1.3.2 认证管理器 AuthenticationManager

认证管理器,负责对用户凭证进行有效性认证。

认证管理的整体类关系如下:

这里分为三个步骤,第一步,使用认证处理器(AuthenticationHandler)集合,使用多个认证处理器对凭证逐一校验,直到能通过。第二步,CredentialToPrincipalResolver,把凭证(credential),转换为 认证过的用户凭证(principal)。第三步,AuthenticationPostHandler,认证成功后进行处理,这一步生成KI4SO_SERVER_EC_KEY,与 KI4SO_CLIENT_EC_KEY,他们两的不同之处是,使用的加密Key 不同,SERVER_EC 使用的是 passport 的key,而 CLIENT_EC 使用的各个App 的key。

1.3.2.1 AuthenticationHandler

认证处理器继承继承关系图如下:

选择支持的认证处理器,如果验证成功,返回true,失败返回false,直到验证成功。

1.3.2.2 CredentialToPrincipalResolver

凭证转换器继承实现关系图如下:

image-20190520141117324
image-20190520141117324

你可以实现自己需要的凭证转换器

1.3.2.3 AuthenticationPostHandler

授权管理后置处理,生成加密的KI4SO_SERVER_EC, KI4SO_CLIENT_EC。

1.3.3 KI4SO_CLIENT_EC 验证登录

client_ec 验证过程如下图所示

app端获取到 client_ec后,请求的时候带上 client_ec 这个参数值。app的过滤器(Ki4soClientFilter),拦截到这个请求,这个参数,并去passport 验证这个参数是否正确,验证通过,解密凭证并登录相应的用户。