Web安全域:Servlet规范中定义了Web安全域的概念,用于限制用户对Web资源的访问。所有基于Servlet规范设计的Web服务器都提供了相应的实现。用户无需去写任何程序代码,只需在Web服务器中进行安全域的配置就可以实现对Web应用中的资源进行安全约束。
一、安全域的实现过程
在web应用中配置一个安全域的过程分为如下两个步骤:
1、在web.xml中配置web资源的安全约束,并定义允许访问该资源的角色。
2、在web服务器的安全域中配置登录用户与角色之间的映射。
二、安全域的具体实现示例
例:用户、角色、资源之间的关系:
用户与角色的关系:成员与组的关系。
角色与资源的关系:对应关系,相应的角色具有特定的资源的访问权限。
用户与资源的关系:根据用户的所属角色给定相应资源的访问权限。
如下图:
这里我们的Resources即相应的页面。
即相应的步骤为:
1、用户在登录页面中填写登录信息。
2、Web服务器根据用户填写的登录信息检测安全域中是否定义了相应的用户。已定义,检查用户的角色信息。否则要求用户重新登录并进行验证。
3、Web服务器根据web.xml中定义的允许访问资源的角色,判断当前用户的角色是否具有访问资格。有则允许用户访问,否则拒绝用户的访问请求。
这里要求的Web服务器必须实现HttpServletRequest对象的getUserPrincipal和isUsrInRole方法来返回用户的信息给web应用程序。这里以Tomcat5.5服务器为例进行讲解,其他版本的Tomcat服务器中的安全域配置可能有所不同,但原理相同,我们可以在具体配置时参看Tomcat的文档。
实现安全域的具体步骤:
1、Tomcat安装目录\conf\tomcat-users.xml文件中定义了用户和用户所属角色。
tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="manager"/> <role rolename="tomcat"/> <role rolename="admin"/> <role rolename="role1"/> <user username="both" password="tomcat" roles="tomcat,role1"/> <user username="tomcat" password="tomcat" roles="tomcat"/> <user username="admin" password="" roles="admin,manager"/> <user username="role1" password="tomcat" roles="role1"/> </tomcat-users>
从tomcat-users.xml中第9行可以看出,用户admin没有设置密码,他所属角色为admin和manager,即用户已用户名admin账户进行登录时,他能够访问admin和manager着两个角色所能访问的资源。
2、Tomcat的web应用程序管理平台是名称为manager的web应用程序,位于<Tomcat安装目录>\server\webapps目录下。在manager这个web应用程序的web.xml文件中配置了受安全约束的页面,并定义了允许访问这些页面的角色。
<Tomcat安装目录>\server\webapps\manager\WEB-INF\web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>Tomcat Manager Application</display-name>
<description>
A scriptable management web application for the Tomcat Web Server;
Manager lets you view, load/unload/etc particular web applications.
</description>
<!-- Define the Manager Servlet
Change servlet-class to: org.apache.catalina.servlets.HTMLManagerServlet
to get a Servlet with a more intuitive HTML interface, don't change if you
have software that is expected to parse the output from ManagerServlet
since they're not compatible.
-->
<servlet>
<servlet-name>Manager</servlet-name>
<servlet-class>org.apache.catalina.manager.ManagerServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>HTMLManager</servlet-name>
<servlet-class>org.apache.catalina.manager.HTMLManagerServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>Status</servlet-name>
<servlet-class>org.apache.catalina.manager.StatusManagerServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>JMXProxy</servlet-name>
<servlet-class>org.apache.catalina.manager.JMXProxyServlet</servlet-class>
</servlet>
<!-- Define the Manager Servlet Mapping -->
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/list</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/sessions</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/start</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/stop</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/install</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/remove</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/deploy</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/undeploy</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/reload</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/save</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/serverinfo</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/roles</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Manager</servlet-name>
<url-pattern>/resources</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Status</servlet-name>
<url-pattern>/status/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JMXProxy</servlet-name>
<url-pattern>/jmxproxy/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HTMLManager</servlet-name>
<url-pattern>/html/*</url-pattern>
</servlet-mapping>
<!-- Define reference to the user database for looking up roles -->
<resource-env-ref>
<description>
Link to the UserDatabase instance from which we request lists of
defined role names. Typically, this will be connected to the global
user database with a ResourceLink element in server.xml or the context
configuration file for the Manager web application.
</description>
<resource-env-ref-name>users</resource-env-ref-name>
<resource-env-ref-type>
org.apache.catalina.UserDatabase
</resource-env-ref-type>
</resource-env-ref>
<!-- Define a Security Constraint on this Application -->
<security-constraint>
<web-resource-collection>
<web-resource-name>HTMLManger and Manager command</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>/roles</url-pattern>
<url-pattern>/resources</url-pattern>
</web-resource-collection>
<auth-constraint>
<!-- NOTE: This role is not present in the default users file -->
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<!-- Define the Login Configuration for this Application -->
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Tomcat Manager Application</realm-name>
</login-config>
<!-- Security roles referenced by this web application -->
<security-role>
<description>
The role that is required to log in to the Manager Application
</description>
<role-name>manager</role-name>
</security-role>
</web-app>
这里的<security-constraint>元素用于配置web应用中的安全约束,<web-resource-collection>元素用于声明受保护的web资源,<auth-constraint>元素用于声明可以访问受保护的web资源的角色。
从web.xml中的最后一处蓝色的''manager"值可以知道:manager角色可以访问<web-resource-collection>元素所定义的资源。如果用户访问<web-resource-collection>元素中所定义的页面,则Tomcat服务器要求用户首先登录,如果用户通过登陆验证后(用户名输入了正确的用户名和密码),则检测登录用户所属角色是否具有相应的访问权限,否则就要求重新登录。
3、启动Tomcat服务器后,在浏览器地址中输入http://localhost:8080访问Tomcat的主页(这里不一定是8080端口,有的主机8080端口被占的话,就得改变端口)。
然后单击左侧的"Administrator"栏目中的"Tomcat Manager"超链接,或者直接在浏览器中输入Http://localhost:8080/manager/html,访问Tomcat的web应用程序管理平台首页,浏览器将弹出一个要求用户登录的输入信息框(要求输入Tomcat的用户名和密码)。
4、在弹出的登录信息中输入不正确的用户名和密码(即非tomcat-users.xml中定义的用户名和密码)时,继续要求用户登录。否则Tomcat服务器将返回Web应用程序管理平台的首页。
5、重新启动一个浏览器窗口,在Http://localhost:8080/manager/html页面弹出的登录信息框中输入tomcat-users.xml文件中定义的不属于manager角色的用户名和密码。例如输入用户名为"tomcat",密码为"tomcat".则Tomcat服务器将返回拒绝访问的提示信息。