Serlvet规范中定义 用于配置Web资源安全约束的部署描述符,其配置是独立于Web容器。我们在前面的博客中讲到了Tomcat中安全域的实现。推而广之,我们的web应用的资源安全约束是完全跨Web容器的,只要支持JSP/Servlet的Web容器就可以根据其配置文件web.xml中利用<security-role>,<security-constraint>和<login-config>三个元素进行配置,其配置过程可以分为以下三步:
1、使用<security-role>元素声明在当前web应用中使用的安全角色名。
2、使用<security-constraint>元素声明受保护的web资源及其能够访问受保护资源的角色和HTTP协议。
3、使用<login-config>元素声明服务器将采用哪种类型的验证方式来提示访问者输入身份信息和进行验证。
下面我们就一个具体的例子进行实现安全约束配置:
一、<security-role>配置:声明在当前web应用中使用的安全角色列表。
子元素:<role-name>:用于指定web应用中的安全角色名称
<security-role> <role-name>username</role-name> <role-name>username2</role-name> </security-role>
<role-name>元素可以出现0次或多次。上例中声明了username和username2两个安全角色。
二、<security-constraint>配置:声明受保护的web资源及其能够访问受保护资源的角色和传输协议。
子元素:
1、<web-resource-collection>:声明受保护的web资源,可以出现一次或多次。包含了是三个主要的子元素:
1)、<web-resource-name>:用于标识受保护资源的名称,有且只出现一次。
2)、<url-pattern>:用于指定受保护资源的URL路径,出现一次或者多次。
3)、<http-method>:用于指定受保护的HTTP请求方式(GET、POST等),出现0次或多次。没有出现则所有的HTTP请求方式都受保护。如果用户以指定的请求方式访问受保护的web资源,则要求通过安全验证。
2、<auth-constraint>:声明能够访问受保护资源的角色。可以出现0次或多次。
子元素:
<role-name>:用于指定web应用中的安全角色名称,<role-name>元素可以出现0次或多次。出现多次表示受保护的web资源可以被多个角色访问。如果<role-name>元素的内容为"*",则表示web应用中注册的所有角色都可以访问这个手保护的资源。
3、<user-data-constraint>:指定采用何种通信方式传输受保护的资源。可以出现0次或多次。
子元素:
<transport-guarantee>:值可选为NONE、INTEGRAL和CONFIDENTIAl。其中NONE表示不加密的普通方式传输被访问资源;INTEGRAL和CONFIDENTIAl两个值在当前版本的Servlet规范中区别不大,都只是简单地要求使用SSL方式对数据inxing加密传输,即只通过HTTPS协议访问受保护的Web资源。
<security-constraint> <web-resource-collection> <web-resource-name>webapp</web-resource-name> <url-pattern>/jmxproxy/*</url-pattern> <url-pattern>/html/*</url-pattern> <url-pattern>/list</url-pattern> <url-pattern>/sessions</url-pattern> <url-pattern>/start</url-pattern> <url-pattern>/stop</url-pattern> <url-pattern>/install</url-pattern> <url-pattern>/remove</url-pattern> <url-pattern>/deploy</url-pattern> <url-pattern>/undeploy</url-pattern> <url-pattern>/reload</url-pattern> <url-pattern>/save</url-pattern> <url-pattern>/serverinfo</url-pattern> <url-pattern>/status/*</url-pattern> <url-pattern>*.jsp</url-pattern> <url-pattern>*.html</url-pattern> <http-method>GET</http-method> </web-resource-collection> <auth-constraint> <!-- NOTE: This role is not present in the default users file --> <role-name>manager</role-name> <role-name>username</role-name> </auth-constraint> </security-constraint>
例中说明这个Web应用中的所有JSP页面和HTML页面和其他的一些文件都可以被属于manager或username角色身份的用户以GET请求方式访问。
三、<login-config>配置:声明当用户访问受保护的web资源时,web服务器将采用哪种类型的验证方式来提示访问者输入身份信息和进行验证。
子元素:
1、<auth-method>:指定验证类型。可选值为BASIC、DIGEST和FORM。BASIC指浏览器弹出登录信息输入框和将用户的验证信息采用base64算法编码后传送给web服务器;DIGEST指浏览器也弹出登录信息输入框和将用户信息通过MD5算法进行加密后传送给web服务器(这需要浏览器支持MD5的加密算法);FORM则使用web开发人员自定义的表单页面来输入和验证用户信息,使用FORM验证时,才需要且要求必须定义<form-login-config>元素。<form-login-config>元素包含了两个必须的元素<form-login-page>和<form-error-page>来分别指定开发人员自定义的登录页面和登录错误处理页面。
2、<realm-name>:安全域的名称。
3、<form-login-config>:使用FORM验证时,才需要且要求必须定义<form-login-config>元素
BASIC和DIGEST:
<login-config> <auth-method>BASIC</auth-method> <realm-name>Tomcat Manager Application</realm-name> </login-config>
FORM:
<login-config> <auth-method>FORM</auth-method> <realm-name>Tomcat Manager Application</realm-name> <form-login-config> <form-login-page>/login.html</form-login-config> <form-error-page>/error.html</form-error-page> </form-login-config> </login-config>
当验证方式为FORM时,还必须在自定义的登录表单的action属性值必须设置为伪路径"j_security-check",用户名和密码的字段名必须命名为"j_username"和"j_password".
<HTML> <HEAD> <TITLE> login.html </TITLE> </HEAD> <BODY> <FORM METHOD=POST ACTION="j_security_check"> 用户名:<INPUT TYPE="text" NAME="j_username" /><BR> 密码:<INPUT TYPE="text" NAME="j_password" /><BR> <INPUT TYPE="submit" value="提交" /> <INPUT TYPE="reset" value="重置" /> </FORM> </BODY> </HTML>
最后,对于以上三种验证方式,在web.xml文件中配置的安全约束只对客户端直接请求的资源(包括使用HttpServletResponse.sendRedirect方法重定向的资源)进行保护,即只有用户直接请求的URL与<url-pattern>元素的内容匹配时,安全约束才有效。而对于Web应用中使用forward或include方式转发或者包含的相应页面,安全约束不会生效。