杨世旺 刘波
(广西广播电视技术中心)
JEECMSv9.3平台是江西金磊科技发展有限公司旗下的产品,它是一款集PC互联网、移动互联网和微信网站于一体的网站群管理系统,新门户网站基于此平台进行开发。
单位内部业务系统众多,门户网站作为单位对外开放展示的窗口,将各个业务系统入口整合到门户网站中非常有必要,可解决了各业务系统重复登录的问题。在进行业务系统单点登录整合过程中,发现即使JEECMSv9.3框架提供了统一的单点登录接口,但由于单位各业务系统均已不在维护期,且系统接口不统一或未提供单点登录验证接口,所以只能通过技术手段对平台代码进行二次开发,实现各业务系统单点登录整合功能。
由于整合过程是单向整合,各业务系统无法针对单点登录进行接口调整,所以产生不少技术问题。
通过分析JEECMSv9.3平台代码得知,该平台核心框架为FreeMarker+hibernate+Spirng的mvc分层架构,平台后台采用了Maven开发技术,网站管理后台采用VUE技术,网站前台采用html脚本结合jquery等技术实现。门户网站要实现单点登录功能,需改动网站前台代码和平台后台代码。由于平台的高度可配置性,网站前台代码和后台代码的交互非常灵活,前台的所有链接都需要和后台进行交互,因此对网站代码的熟悉程度对于单点登录功能的开发非常关键。
系统后台采用eclipse集成管理工具作为java代码编译环境,前台网站代码由于都是通过平台动态生成的,不适合采用任何开发工具去编译开发,所以只能采用文本编辑的方式去调整。此外,网站前台采用html静态脚本进行展示,而网站后台采用java进行相应基本逻辑处理,因此选择通过jquery技术实现前后台的同步、异步交互,来协助实现单点登录功能的集成。
集成单点登录的目的是实现各业务系统的免登录进入,其基本设计逻辑为:
点击单点登录入口,先检测门户网站是否已登录,如未登录,则进行提示并跳转到门户登录页面;
如果门户网站已登录,下一步则是判断该业务系统是否已进行绑定,如未绑定,则自动跳转到绑定页面;
如果业务系统已绑定,则在记录此次登录的相关信息后,直接跳转进入业务系统。
基本设计逻辑流程展示如图1。
图1 基本设计流程
记录业务系统的绑定、登录等信息时需要和数据库进行交互,保存业务系统的名称、用户名、密码、绑定时间、登录时间、登录次数等,详细的数据表设计如表1。
表1 表结构设计
1.跳转判断
当用户点击业务系统入口时,系统需要将该业务系统的服务器网址、端口、验证方法等参数传递到后台进行验证,为了方便这些参数读取,将参数以json对象的形式,保存在js配置文件中。
门户网站业务系统入口使用html技术中的标签进行展示,首先将标签中的href属性设置成(#)空锚点,使其在单击时不做跳转刷新,而在标签单击(onclick)方法功能中,添加绑定js中自定义的ITool.sso函数,如:
在绑定的ITool.sso方法中,通过使用jquery的ajax技术,实现与java后台进行交互,获取门户网站登录、业务系统绑定信息,并在交互成功后,通过逻辑判断,设定跳转链接,跳转到登录页面、绑定页面或直接单点登录进入业务系统,实现逻辑如图2。
2.绑定操作
图2 页面跳转判断
当判断业务系统未进行绑定时,系统自动跳转到绑定页面,系统绑定页面借鉴了网站登录页面,需要用户输入绑定系统的用户名和密码,然后点击绑定按钮,系统将通过ajax方法和后台交互,并进行第三方跨域提交验证。在和第三方系统进行跨域登录认证时,经过多次尝试,由于第三方业务系统不一定支持ajax异步认证的方式,所以该认证统一采用后台认证的方式。
由于不同的业务系统的跨域认证会返回不同的认证结果,在系统认证设计时,通过动态js方法,实现不同的业务系统的认证跳转。
在进行第三方跨域认证时,使用后台java的URLConnection类,读取请求URL,并返回请求结果的页面内容信息,通过对页面内容进行解析,判断认证是否成功,如图3。
图3 第三方跨域登录认证
判定是否绑定成功,如绑定成功,则直接跳转单点登录进入业务系统,如失败,则在页面上已红色字体提示错误信息。
3.登录跳转
在绑定成功或者判定用户已绑定业务系统后,需要使用前台jquery技术,动态创建所需提交的元素标签,模拟业务系统的form表单提交方法,实现逻辑如图4。
4.绑定管理
在用户对业务系统进行绑定后,可能会存在所绑定的业务系统用户名或者密码已修改的情况,针对这种情况,前台增加了绑定管理功能,实现对业务系统的解除绑定、重新绑定等功能。
1.代码逻辑
通过分析平台后台代码,将单点登录后台java代码的实现附加在平台用户管理模块;后台代码主要需要实现用户网站登录状态、绑定状态获取,页面跳转参数获取及调整等。
图4 登录跳转
用户网站登录状态、绑定状态获取,首先获取网站登录用户信息,如获取不到,则返回用户登录状态为false,如能获取,则根据用户ID和参数到数据库读取绑定信息,如已绑定,则进一步返回绑定的用户名和密码等相关信息。
在进行第三方跨域用户绑定认证时,采用后台java的URLConnection类,实现方法中,除了传递请求的httpUrl外,还需传递进来编码方式和超时时间,否则会造成返回结果乱码或在网络不通畅时网页卡顿的现象。
此外,为了保证代码的严谨性、可读性,在进行后台java编码时,需严格遵守平台的后台编码规范,这对系统的后续升级维护至关重要。
2.数据库操作
单点登录的绑定信息,最终都会保存到数据库表sso_user中,实现逻辑设计如下:
当第一次绑定时,判断是否已绑定过,如已绑定,则修改绑定状态,如未绑定,则记录绑定系统编号、用户ID、绑定用户名称、加密后的绑定用户密码,绑定时间等;
用户进行单点登录时,记录用户的登录次数,登录时间等;
进行解除绑定时,修改该绑定的状态、最后修改时间。
第一、在进行单点登录第三方跨域认证时,经过多次尝试,最终选定使用后台java的URLConnection类来实现,因为第三方业务系统不一定支持ajax异步认证的方式,所以验证时是直接调用业务系统的登录方法来实现,所以无法使用前台ajax请求来获取认证请求结果;
第二、在进行第三方系统登录跳转时,模拟form表单进行提交时,需要注意提交页面的编码方式,做到动态修改成第三方网站所需的编码方式,在提交后,再将网站编码方式修改回来,否则会造成原网站乱码或功能异常;
第三、当遇到实在无法单向去对第三方系统进行判断验证或者登录时,最好的方式还是通过和相关技术人员进行沟通,获取第三方系统的相关信息,如在和对接集成时,是否要对参数进行加密操作等,这集成前是无法预知的,所以及时的沟通非常重要。
目前单位的门户网站OA办公、监控平台两个单点登录接口已经完成编码和测试工作,程序已可正常运行;如后续需要增加其他第三方接口时,可以有所借鉴或者直接复用已有的接口,减少不必要的重复工作,提高工作效率。