陈海虹
(浙江海洋学院网络中心,浙江舟山 316004)
如今不论是高校还是企事业单位,WEB应用系统日渐增多,每个应用系统都有自己的用户管理机制和身份认证机制。用户需要记住多个甚至十几个系统的账号和密码,登录许多应用系统才能完成他们的日常工作。所以,需要在多个WEB应用系统中实施单点登录方案,用户只需要登录1次就可以访问所有相互信任的应用系统,并且在系统之间切换时,将不再受到访问限制。目前实现单点登录的技术主要有2种:一种是采用1个具有单点登录功能的协议来完成;一种是利用业界常用的“伪登录”技术。采用具有单点登录功能的协议来完成的一个典型代表就是使用Kerberos协议,Kerberos协议提供了采用票据来访问目标系统,这也是目前采用的一种比较流行的单点登录技术,它具有更安全、更具弹性、更高效率的优点[1]。但是也有一定的不足,它需要对目标系统或目标服务进行协议化,同时需要对应用系统做出适当的改造,这就限制了它对一些不愿开放的应用系统的应用。因为一些应用系统的结构和接口不开放,造成了第三方无法与其对接,另外,还有一些企业也不愿意对系统进行修改。“伪登录”技术,就是通过一些脚本自动为用户输入账号和密码,屏蔽用户登录目标系统,这种技术体现了与应用系统的无关性,例如与应用系统的平台、开发环境、结构、编程语言以及脚本,所以应用系统无需做任何修改。基于PHP的WEB应用系统单点登录就是根据“伪登录”技术原理,通过PHP语言并结合MySQL数据库来实现单点登录功能。
PHP语言是一种广泛用于Web开发并可以嵌入HTML的多用途的脚本语言。PHP能运行在包括Windows、Linux等在内的绝大多数操作系统环境中,并支持Oracle、Sybase、MySQL、ODBC等在内的大多数常见数据库,具有很好的跨平台性;PHP是开源软件,代码在许多工程师手中进行了检测,同时它与Apache编译在一起的方式也可以让它具有灵活的安全设定,具有了公认的安全性能;PHP还具有占用系统资源少、代码执行速度快等优势。
MySQL是个真正的多用户、多线程SQL数据库。它是完全免费的,它的平台无关性使其能在多个操作系统上运行,其中包括UNIX、Linux、Solaris、SunOS、FreeBSD等,它还具有文件体积小、支持多线程、优化SQL查询算法、执行速度快等优势。目前MySQL被广泛地应用在Internet上的中小型网站和各种中小型数据库管理工作,如财务、行政、金融、经济、统计和审计等领域。
目前大部分WEB应用系统的身份认证技术在应用层上是基于HTTP协议,HTTP协议采用了请求/响应模型。通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求,一旦收到请求,服务器向客户端发回一个状态行,比如“HTTP/1.1 200 OK”,和响应的消息。HTTP请求报文格式为:请求行-通用信息头-请求头-实体头-报文主体;响应报文格式为:状态行-通用信息头-响应头-实体头-报文主体。
基于HTTP协议的客户端访问服务器包括4个过程,分别是建立TCP套接字连接、发送HTTP请求报文、接收HTTP应答报文和关闭TCP套接字连接。HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号代表URL的结尾与请求参数的开始,传递参数长度受限制。当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。
每个WEB应用系统几乎都需要数据库来存储用户的身份认证信息和其他的数据信息,但是彼此数据库的类型、库表结构、字段值、加密方式都不同,无法直接在各应用系统的数据库中读出和操作用户身份认证信息。所以,需要一个独立的数据库来单独存储用户在各应用系统的身份认证信息。
本系统采用MySQL数据库。数据结构主要包含3张表,分别是:sso_app_info、sso_app_props、sso_login_info。
sso_app_info表存放:PHP模拟HTTP客户端登录各应用系统用到的数据信息、允许用户输入账号密码的表单元素名、用户身份验证失败应用系统返回的信息。sso_app_props表存放:允许用户输入除账号密码外其它表单元素名,这张表中的数据主要用来构建动态或静态表单。sso_login_info表存放:用户成功登录各应用系统的身份认证信息。图1是这个数据结构的数据库模型图。
图1 数据库模型图Fig.1 Database illustration of model
单点登录主要与应用系统和用户有关,所以首先分配三个变量标识应用系统和用户,它们分别是应用系统的ID号、应用系统名称、用户ID号,它们的值分别与表sso_app_info中的uid、name字段和表sso_login_info中的userid字段相对应。单点登录模型依据这3个值判断哪个用户登录到哪个应用系统。
如果数据库表sso_login_info中有符合这些变量的记录,则说明用户曾成功登录过这个应用系统,取出库中数据,以URL形式或动态表单形式传递登录数据并自动登录到WEB应用系统。
如果没有记录,说明用户首次登录这个应用系统,由单点登录系统生成或直接调用静态表单页面,让用户初次完成应用系统认证信息的输入过程。并用PHP模拟浏览器客户端传递用户输入的认证信息,通过这个方法检查用户输入的认证信息是否能通过WEB应用系统服务器的认证。
如果用户输入的认证信息能通过WEB应用系统服务器的认证则将认证信息存入库中,并借助URL形式或者动态表单形式传递认证信息并自动登录应用系统,否则输出错误信息。程序流程图如图2所示。
图2 总体设计程序流程图Fig.2 The flowchart of system design
用户输入账号、密码等登录信息后,应用系统服务器需要判断是否通过此认证。可用PHP模拟HTTP客户端,发送认证信息及接收反馈信息,从反馈信息中判断认证是否被通过。PHP模拟HTTP客户端的程序流程图如图3所示。fsockopen函数可以打开指定网域的TCP套接字连接或IP地址的TCP套接字连接,然后传回1个文件指标,这可以和fwrite等函数一起使用。相关代码[3]如下:
图3 PHP模拟浏览器登入流程图Fig.3 The flowchart about using php to mimic browser logining
表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如文本域、下拉列表、单选框、复选框等等)输入信息的元素。
为了获取不同应用系统中不同用户的登录信息,需要预先生成供用户填写的模拟应用系统登录界面的表单。不同的应用系统具有不同的表单元素,可以先分析各应用系统的表单元素并存入数据库中,然后利用PHP语言加载数据库中的数据生成具有表单元素的登录页面,为了提高速度,再将动态页面生成静态页面。相关代码如下:
代替用户输入认证信息自动登入WEB应用系统的步骤中也用到了表单。
为了达到程序的强健性,将HTTP协议中的GET和POST方法相结合来提交请求认证信息,因为有的系统不支持跨域POST方法。GET方法将认证请求信息放在URL中传递给系统服务器,POST方法是将认证请求信息作为表单元素提交给系统服务器。相关代码如下:
依据“伪登录”技术原理采用PHP脚本语言自动为用户输入账号和密码,模拟用户登录应用系统的单点登录模型,使用户只须完成最初的登录过程就可以直接访问应用系统,无须每次访问一个应用资源都登录1次,大大提高了工作效率。这个模型与应用系统无关,应用系统无须修改就可使用,具有高度扩展性,同时,即使单点登录系统失效,应用系统仍可以正常使用,容错性好。需要改进的地方是,它没有将存储认证信息的数据库与其他应用系统的数据库同步起来。
[1]朱 婵.基于Kerberos票据的Web单点登录设计[J].现代计算机,2007(2):76-77.
[2]STEVENS W R.TCP/IP详解·卷3:TCP事务协议、HTTP、NNTP和UNIX域协议[M].北京:机械工业出版社,2002.
[3]WILLISON.httpClient-a PHP Web Client Class[CP/OL].[2003-04-06].http://scripts.incutio.com/httpclient/index.php.