借助Session对象实现Web应用的用户身份识别
2009-01-06
作者:李利,王秀峰
1 引言
通过浏览器操作的简易性和实现的方便性,使得基于B/S结构的Web应用模式日渐流行;在Web应用环境中,特别是多角色用户情况下,不同的用户拥有的操作权限不同,用户的身份识别非常重要。本文对Web应用用户身份识别的难点做了简单剖析,并从应用程序的角度实现了用户的身份认证。
2 用户身份识别的难点——HTTP协议的无状态性
HTTP协议(即超文本传输协议,Hyper Text Transfer Protocol)是一个应用层的网络协议,采用客户-服务器模式,用来发送客户请求的服务器上的资源。Web应用程序的用户通过浏览器进行操作,以浏览器作为客户端采用HTTP协议同Web服务器进行交互,完成相应的工作,由此可见,HTTP协议是Web应用程序的重要基础之一。
每个Web站点都有一个服务器进程,它在特定TCP端口(默认80)上不断监听,以便发现是否有浏览器向它发出连接建立请求;一旦监听到连接建立请求并建立了TCP连接之后,浏览器就向服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应;发送完响应后,服务器关闭TCP连接。服务器处理下一个请求与上一个请求没有任何关系,对于HTTP服务器而言各个请求都是一样的,不会保留各次处理时的信息,这就是HTTP协议的无状态性。
HTTP的无状态性既是优点,也是缺点,协议原本的设计在于共享资源,“无状态”的设计较有效率也容易实现,很适于它的典型应用。但对基于Web的应用,却很不方便,特别是对拥有各种角色、权限的多用户系统来说,可能要求对用户的权限进行区分,不同部门、不同角色能够查看的页面不同,对同一页面的操作权限也可能要做区分,这就要求对用户的身份进行验证,通过验证的用户还要保留其身份标识,以维护对相关联页面的操作权限。因为HTTP协议本身不维护请求之间的状态信息,若仅仅通过协议本身,服务器无法判断各请求之间的关联性,也就是说,我们尽管可以使用户进入Web应用的默认页面为登陆页面,让用户输入用户登陆名及密码等信息以实现用户身份验证,然后再通过链接或其它机制转到其它相关页面,但是如果不采取其它措施,用户即使不从登陆页面进入也可以通过输入URL的方式对网站上其它页面进行不受限制的访问。因而,能够识别用户的身份、识别一系列远程客户的请求是从同一个客户处发出的,是建立有效的基于Web的应用程序的关键。
3 解决之道——善用会话(Session)对象
会话可以认为是某个用户和服务器之间的一系列相关的交互,这个交互会持续一段时间。对于单个用户而言,会话过程的开始以用户开始访问某个网站为标志,会话过程的结束以用户结束对该网站的访问为标志。不同的用户对应着不同的会话过程,不同的会话过程之间互不干涉,互不影响。
按对象的术语讲,一个会话可以看作是一个对象,它驻留在服务器上的应用程序中并受应用程序的影响。一旦在服务器上建立了一个会话,一个称为Session ID 的唯一标识符就与此会话相关联。每一个访问网站的用户在服务器端可以拥有自己唯一的一个会话对象,此会话对象为此用户所独享,即此会话对象同用户有一一对应的关系,用户只能检索自己的会话对象,而不能访问其它用户的会话对象;并且通过session对象的设置属性的方法(setAttribute)可以将其它对象绑定到此会话对象,相应的通过session对象的取得属性的方法(getAttribute)可以检索绑定到此会话对象的其它对象。
注意到会话是客户和服务器之间一一对应的联系,这一点非常重要,我们可以通过这个联系将用户的身份信息绑定到会话对象上,解决身份认证和权限区分问题。
4 简单示例
下面,我们借助session对象,通过采用JSP+JavaBean+数据库的方式实现一个用户认证的简单示例。
4.1 Web应用程序结构
Web应用的用户界面结构如下图所示,用户首先进入登陆页面 /set/login.htm ,在其中输入用户ID和密码;在 /set/login.jsp中进行校验,若校验通过,则在session保存用户身份信息,并根据用户所属部门将页面导向相应部门主页面,否则,将页面导向登陆页面重新输入用户ID和密码;对于需进行身份验证的页面,从session对象中检索用户身份信息,如果能检索到,说明用户已经得到身份验证,反之,若检索不到用户身份信息,说明用户还未经过身份验证(可能是通过在浏览器地址栏输入URL的方式直接进入该页的),则将页面导向到登陆页面;若通过认证的用户拥有操作此页面的权限,则允许操作,否则,显示权限错误信息。
4.2 JavaBean
本实现中,需要用到如下几个JavaBean(特殊的类) :
User类:即用户类,表示一个登陆到网站的用户,具有用户编号、密码、部门、角色等属性已及对这些属性进行存取的相应方法。
UserManager类:用户管理员类,对用户合法性进行校验。实现代码如下:
package wxf.set;
import java.sql.*;
public class UserManager{ //用户管理员类,用来通过查询数据库对用户验证
public User checkUser(String userid,String password){
/**通过查询数据库,如果存在用户编号为userid并且密码为password
*的用户则构造一个User 类的对象,并对此User类的对象设置userid,
*department,role 等属性,然后返回此对象;
*如果不存在编号为userid并且密码为password
*的用户则返回null
*/
}
}
4.3 登陆验证页面(login.jsp)
<%@ page language="java" %>
<%@ page import="wxf.set.*"%>
<%
String userid=request.getParameter("userid");
String password=request.getParameter("password");
UserManager aUM=new UserManager();
//校验用户编号和密码,确定是否为合法用户
User aUser=aUM.checkUser(userid,password);
if(aUser!=null){ //是合法用户
session.setAttribute("user",aUser); //将aUser对象绑定到session对象
if(aUser.getDepartment().equals("dp1")){
//如果用户属于部门1则转到部门1的主界面
response.sendRedirect(response.encodeRedirectUrl("/set/dp1/index.jsp"));
}
else if(aUser.getDepartment().equals("dp2")){
//如果用户属于部门2则转到部门2的主界面
response.sendRedirect(response.encodeRedirectUrl("/set/dp2/index.jsp"));
}
}
else{
//不是合法用户,则转到登陆界面
response.sendRedirect(response.encodeRedirectUrl("/set/login.htm"));
}
%>
4.4 身份验证代码
非法用户在未通过身份验证的情况下,可能通过键入URL非法访问某个特定JSP文件,为此,必须对要保护的页面安排身份检查代码。因为对每个登陆到网站的用户,都可以拥有自己独享的唯一的session对象,每个用户只能访问自己的session对象;因此,可以在要求认证的JSP文件的开头安排如下代码:从session对象中检索用户(User)对象,因为用户如果是从登陆页面进入并且是合法用户,则在登陆时已经将用户的身份信息封装成User对象绑定到session对象上了,所以如果能检索到,说明用户是经过了合法认证进到该页面的,否则,说明用户还未经过认证,需要将页面转到认证页面;如果经过认证,则再从用户对象中检索其角色(role)属性,若允许此角色的用户访问该页,则显示页面内容,否则,显示权限错误信息。示例代码如下:
<%
//从session对象中检索名称为user的对象
User theUser=(User)session.getAttribute("user");
if(theUser==null){ //如果不能能检索到用户对象
response.sendRedirect(response.encodeRedirectUrl("/set/login.htm");
}
else{ //如果存在用户对象则取得用户的角色信息
String theRole=theUser.getRole();
//假使角色为11的用户可以访问
if(!theRole.equals("11")){
out.println("对不起,您无权访问此页!");
}
else{
//显示页面内容
}
}
%>
5 总结
Web应用的关键是要识别用户,HTTP协议的无状态性使服务器无法跟踪用户操作的相关性;JSP内建的session对象,是每个登陆到网站的用户独自拥有的,我们可以借助session对象保存用户的身份信息,对涉及需要特殊身份才能访问的页面设置身份校验代码,检索用户session对象中的身份信息进行校验,可以较好实现用户身份识别。
参考文献
【1】谢希仁.计算机网络(第二版).北京:电子工业出版社,1999.4
【2】Karl Avedal, Danny Ayers 等.JSP编程指南.北京:电子工业出版社,2001
【3】黄理,洪亮,等.JSP高级编程.北京:北京希望电子出版社, 2001
【4】丁振凡.ASP应用系统中用户认证设计.计算机时代,1999(8).