共计 1261 个字符,预计需要花费 4 分钟才能阅读完成。
本项目主要讲解的是单点登录系统的原理及其实现。
相关代码 github 链接。
本章主要讲解的是同域下单点登录分析。
同域下 SSO 分析与设计
流程图虽然看着复杂,但大家不要被吓到啦 ^ _ ^,请大家参照着流程路,听我下面细细道来~~
详细流程分析
项目结构
在 github 的代码中,我建立了三个项目,分别是服务端 SSOServer、客户端 SSOClient、以及两个集成了客户端的业务系统 app1 与 aPP2。
SSO 流程分析
将 SSOServer,app1,app2 启动后,开始 SSO 流程分析。
1)未登录访问业务系统
未登录访问业务系统 app1 的 index 页面:请求被客户端的 Filter 拦截。
由于没有 token,客户端 Filter 控制其进行登录操作,并将原始的 URL 作为请求的参数。
2)用户执行登录操作
进入服务端的 UserLoginServlet 进行登录操作。进入登录页时,获取 URL 中的参数——原始的 origRUL,将其作为 request 对象的属性,方便后人获取,并且跳转到服务端的登录页面。
用户提交表单,服务端获取表单中信息后,到数据库中进行查询。若登录失败,则返回原来的登录页面,并携带原来的 URL,将原始的 URL 作为表单的隐藏属性。
若登录成功则:
1. 生成 token。
2. 将 token 与其对应的 user 放到全局唯一数据结构中,方便所有人进行获取。
3. 给该用户设置一个 cookie,值为 token,用户在下次访问的时候就会携带此 cookie,服务端也就可以通过该 cookie 对其身份进行验证。
4. 判断原始 URL 是否为空,若不为空则跳转到原始 URL 页面,否则跳转到成功登录页面。
在用户要跳转到原始 URL 页面的时候,被客户端的 Filter 拦截,进行有无 token 的验证,由于经过登录操作在 cookie 中已经生成了 token,故 Filter 发送 Http 通信请求服务端进行 token 有效性的验证,并将 token 作为请求参数。
服务端的 TokenValidateServlet 获取参数中的 token 后,到全局唯一数据结构中查找有无该 token 对应的 user。若没有,则证明该 token 可能已经失效或是伪造的,则向客户端返回空字符串,否则返回查询到的 user 信息。
拦截器接收到服务端的返回信息,若为空字符串则返回原始登录页面,并携带原始 URL,否则通过传来的用户信息,对 user 对象进行还原,方便下个人获取,拦截操作结束,成功进入了业务系统的 index 页面,并将 request 对象携带的 user 信息显示出来。
3)业务系统增加自己的拦截器
在通过了客户端的拦截器之后,业务系统还可以自定义拦截器,从而根据用户信息获取与本系统相关的用户业务信息,或者是对用户的权限进行进一步的验证,如:” 猪猪 ” 不可访问 index 页面等 QAQ。
4)单点退出
服务端从 request 对象的 cookie 中获取 token 的值,将这个 token 从全局数据结构中移除,并且将用户保存有该 token 的 cookie 设置为无效的。
关于代码部分,我将会在下一章节中进行详细解释~~~ 大家多多关照!^ _ ^