可以告诉服务器应该使用哪个验证方法。"了不起,"有人会说,"这个没什么用,除非配置需要保护的URL。"没错,配置这些URL然后描述它们应有的保护正是security-constraint元素的作用。这个元素包含4个子元素:web-resource-collection, auth-constraint, user-data-constraint和display-name。下面对其中的每个元素进行描述。
web-resource-collection元素
该元素标识需要保护的资源。所有security-constraint元素必须包含至少一个web-resource-collection。该元素有一个web-resource-name元素,后者提供一个任意的标识名,还包含一个url-pattern元素以指出哪些URL需要保护。另一个可选的http-method元素为保护应用指定HTTP命令(GET,POST等;默认是所有方法),还有一个可选的description元素用于提供文本说明。比如,下面的web-resource-collection(在一个security-constraint元素中)配置了Web应用程序proprietary目录下所有的文档都需要保护。
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>Proprietary</web-resource-name>
- <url-pattern>/proprietary/*</url-pattern>
- </web-resource-collection>
- <!-- ... -->
- </security-constraint>
务必注意,url-pattern只能应用于可以直接访问资源的客户端。在某种特殊情况下,它不能够应用在通过MVC框架的RequestDispatcher或jsp:forward访问的页面。这个不对称性如果利用得当,将非常好。比如,在MVC框架中一个servlet查找存储在bean中的数据,然后跳转请求到一个从bean中提取数据并显示数据的页面。需要确保JSP页面不能够被直接访问,只能通过页面将要用来创建bean的servlet才能访问。url-pattern和auth-constraint元素可以通过声明任何用户都不能直接访问这个JSP页面来达到此目的。但这个不对称性使开发人员放松了警惕,允许他们偶尔能够不受限制的访问保护资源。
核心警告:这些保护只能应用于防止客户端直接访问。安全模式不能应用于通过RequestDispatcher或jsp:forward访问的页面。
auth-constraint元素
尽管web-resource-collection元素配置了哪些URL需要保护,auth-constraint元素配置了哪些用户可以访问被保护的资源。这里还应该包含一个或多个role-name元素来标识有权访问资源的用户类型,另外还可以有一个可选的description元素来描述这个角色。所有出现在web.xml的auth-constraint子元素role-name中的角色名称必须是在security-role元素中全局声明的角色。这个security-role元素直接在web-app元素下。它包含一个或多个的role-name子元素。例如,下面web.xml中的security-constraint元素说明只有被指定为Administrators或者Big Kahunas(或者两者都是)的用户才有权访问指定的资源。
- <security-constraint>
- <web-resource-collection>...</web-resource-collection>
- <auth-constraint>
- <role-name>administrator</role-name>
- <role-name>kahuna</role-name>
- </auth-constraint>
- </security-constraint>
- <security-role>
- <role-name>administrator</role-name>
- <role-name>kahuna</role-name>
- </security-role>
注意,整个处理过程的可移植部分就是在这一点终止的。服务器怎样检查哪个用户属于哪个角色以及它怎样存储用户密码,完全依赖于系统。详细请参见3.1节,通过使用Tomcat的方法。
比如,在默认情况下,Tomcat使用install_dir/conf/tomcat-users.xml文件将用户名和角色名密码相关联,如下面的例子所示,将用户joe(密码为bigshot)和jane(密码为enaj)指定属于administrator和/或kahuna角色。
- <tomcat-users>
- <user name="joe"
- password="bigshot" roles="administrator,kahuna" />
- <user name="jane"
- password="enaj" roles="kahuna" />
- <!-- ... -->
- </tomcat-users>
核心警告:容器管理安全机制需要一个重要的服务器特有组件。具体说来,必须使用一个特定方法来将用户名和密码相关联,将用户名与角色名进行映射。
user-data-constraint元素
这个可选的元素表明当相关资源被访问的时候应该采用传输层保护。必须包含一个transport-guarantee子元素(合法值为NONE,INTEGRAL或者CONFIDENTIAL),还可以包含一个可选的description元素。transport-guarantee元素的值为NONE(默认值)时使用无限制的通信协议。值为INTEGRAL表示在通信过程中避免数据在没有察觉的情况下被修改。值为CONFIDENTIAL表示数据在以一种不能被拦截数据的人读取的方式传输。虽然在理论上(和将来的HTTP版本中),INTEGRAL和CONFIDENTIAL有一定的差别,但在当前的实际中,它们都只是简单使用SSL的指令。比如,下面的代码只允许服务器使用HTTPS链接到相关资源。
- <security-constraint>
- <!-- ... -->
- <user-data-constraint>
- <transport-guarantee>CONFIDENTIAL</transport-guarantee>
- </user-data-constraint>
- </security-constraint>
display-name元素
这个很少使用的security-constraint子元素用于为一个可能使用GUI工具创建的安全约束提供名称。
附摘:
JSP和servlet核心编程
使用和部署Web应用 | |||||||||||||||||||||||||||||||
|
使用web.xml配置Web应用 | ||||||||||||||||||||||||||||||||||||||||
|