概述
Servlet技术规范规定了两种由容器实现的Web应用程序的安全模型,分别是:
1)声明性安全模型:指可以在部署的时候由部署者为Web应用的资源配置安全限制,比如我们可以将用户放到特定权限的组里和为特定的资源配置身份认证等,这些工作都可以在web.xml中配置完成。
2)程序性安全模型:指由程序员在代码中使用特定的方法来限制某些资源的访问,但是注意的是如果安全规则发生了变化,就必须重新修改代码并编译,比较麻烦,所以使用的不多。
由一个例子说开
虽然在前面的《SCWCD之路——Web应用的结构和部署》 一文中已经讲述过如何在web.xml中配置各种安全描述符,但是零散,下面给出一个比较具体的例子:考虑有一个admin.jsp的页面,这个页面必须有一定权限才可以访问,假设访问的用户角色必须是administrator,并且这个角色组中有一个用户名就是administrator。
1)编写访问受限的页面admin.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Admin Page</title>
</head>
<body>
<h1>Hello, Administrator</h1>
</body>
</html>
2)配置web.xml,限制admin.jsp页面的受访问(节选)
<web-app> <security-constraint> <display-name>Test</display-name> <web-resource-collection> <web-resource-name>AdminPage</web-resource-name> <description/> <url-pattern>/admin.jsp</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>administrator</role-name> </auth-constraint> </security-constraint> <login-config> <!--这里采用基本的登录配置--> <auth-method>BASIC</auth-method> <realm-name>Welcome to administrator page</realm-name> </login-config> </web-app>
3)配置角色及属于该角色的用户(角色是administrator,用户名是administrator),这里以Tomcat为例子,修改Tomcat的tomcat-user.xml文件,在其中添加如下内容
<tomcat-users> <!--定义角色--> <role rolename="administrator" /> <!--定义用户--> <user name="administrator" password="123" roles="administrator" /> </tomcat-users>
4)这个时候在浏览器的地址栏里输入admin.jsp的地址,将会出现验证的对话框,如下图
5)在对话框中输入用户名administrator和密码123即可看到admin.jsp页面。(修改tomcat-user.xml后可能需要重启Tomcat)
6)在上面的操作中是直接修改Tomcat下的tomcat-user.xml文件的,这样可能会给其他的用户造成不便,不是好办法。可以在该项目的WEB-INF文件夹下新建一个用户文件(如web-user.xml),然后在该文件中加入如下内容:
<tomcat-users> <!--定义角色--> <role rolename="administrator" /> <!--定义用户--> <user name="administrator" password="123" roles="administrator" /> </tomcat-users>
这个时候还需要告诉Tomcat在项目启动的时候加载这个文件,到该项目的META-INF文件夹下修改context.xml文件如下:
<Context antiJARLocking="true" path="/WebTest">
<!--注意pathname必须正确,否则可能报告找不到该文件-->
<Realm className="org.apache.catalina.realm.MemoryRealm" pathname="webapps/WebTest/WEB-INF/web-user.xml" />
</Context>
之后再在浏览器里输入admin.jsp页面的地址,照样会看到验证的对话框。
7)在上面的步骤中,密码都是采用明文的形式保存的,这可能会给程序留下安全隐患。所以有的时候需要对这些密码进行加密处理。使用Tomcat 6.0中提供的库文件catalina.jar(位于Tomcat安装目录的lib目录下)即可方便地获取字符串的MD5值,所以这里使用MD5来对密码进行处理。(使用catalina.jar还需要另一个库文件tomcat-juli.jar的支持,位于Tomcat安装目录的bin目录下,附件中有这两个文件),使用如下命令获取123的MD5值,如:
可以得知123的MD5值是202cb962ac59075b964b07152d234b70,可以用这个来代替原来的明文密码,修改web-user.xml文件的内容为
<tomcat-users> <!--定义角色--> <role rolename="administrator" /> <!--定义用户--> <user name="administrator" roles="administrator" password="202cb962ac59075b964b07152d234b70" /> </tomcat-users>
并且修改context.xml的内容为
<Context antiJARLocking="true" path="/WebTest"> <Realm className="org.apache.catalina.realm.MemoryRealm" pathname="webapps/WebTest/WEB-INF/web-user.xml" digest="MD5" /> </Context>
之后再在浏览器里输入admin.jsp页面的地址,照样会看到验证的对话框,至此,全部工作完成。
安全配置中的登录配置
在上面的例子中使用了基本的登录配置,其实验证方法一共有四种,这里来系统地讲述下。
1)BASIC验证:该验证方法比较简单且使用较为广泛,形式是当你要访问某受限资源时会弹出一个对话框要求你输入用户名和密码,在这里用户名采用明文方式发送,而密码则采用Base64编码发送,安全性较低。
2)DIGEST验证:该验证方法与BASIC基本一致,不同的是它预先在服务器端存放了用户名和密码的MD5值,在网络上传输的也是MD5值,传到服务器后才与服务器进行对比,所以安全性较高。
3)FORM验证:该验证方法由程序员来指定一个登录的表单页面,当用户需要访问受限资源时则出现提示用户输入用户名和密码,包括一个出错页面,安全性也比较低,但是在考试的时候出现比较多。下面给出一个例子,如:
编写包含Form的页面auth.jsp(节选)
<form action="j_security_check" method="post">
userName:<input type="text" name="j_username" /><br />
password:<input type="text" name="j_password" /><br />
<input type="submit" value="authenticate">
</form>
上面的代码中需要注意的是action必须为j_security_check,用户框名是j_username,密码框名是j_password
然后修改web.xml,添加如下内容
<web-app>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>Welcome to administrator page</realm-name>
<form-login-config>
<form-login-page>/auth.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
<web-app>
4)CLIENT-CERT验证:该验证方法需要和SSL及数字证书来一起使用,考试时不怎么出现,这里给个思路:可以使用JDK提供的keytool工具来生成自己的密钥文件,再根据密钥文件输出数字证书,然后使用浏览器(如IE)导入数字证书,之后再去Tomcat中开启https协议(默认是注释掉的,内容如下)
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
重启Tomcat后,如果证书成功,则会出现如下提示:
如果浏览器没有导入证书,则会出现如下提示:
总结
安全配置在考试中同样占有一定的分量,但是平常的资料却很少提及,希望这篇文章能给予大家一些帮助。