12.1.2 实施安全约束

12.1.2 实施安全约束

WEB-INF目录下的资源客户端不能直接通过URL访问,不过,我们可以通过ServletJSP页面访问WEB-INF目录下的资源。

但是,如果你只是简单地想保护资源拒绝未经授权的用户访问,允许经过授权的用户访问,这可以在部署描述符中声明安全约束来实现。

security-constraint元素说明

部署描述符中的security-constraint元素允许不通过编程就可以限制对某个资源的访问。这个元素有两个子元素:web-resource-collectionauth-constraint

web-resource-collection子元素

web-resource-collection元素表示需要限制访问的资源集合。包括web-resource-namedescriptionurl-patternhttp-methodhttp-method-ommission等子元素。

  • web-resource-name子元素用于设置与受保护资源相关联的名称。
  • url-pattern子元素设置受保护资源的URL的正则表达式,例如:
    • *.jsp表示保护所有的jsp文件
    • /*表示保护所有的资源
    • /jsp/*表示保护jsp目录下的所有资源
    • 不能同时指定目录星号.后缀名,下面的URL表达式指定jsp目录下的所有JSP页面是无效的:/JSP/*.jsp
    • url-pattern仅适用于客户端可以直接访问到的资源。特别是,它不适合于通过MVC体系结构利用RequestDispatcher来访问的页面,不适合于利用类似jsp:forward的手段来访问的页面。
  • http-method元素中写入一个HTTP方法,比如GETPOST,表示该HTTP方法可以访问到这些资源集合.
    • 如果没有http-method元素,这表示将禁止所有HTTP 方法访问这些资源。
  • http-method-omission元素中写入一个HTTP方法,表示使用该方法无法访问到这些资源集合。
    • http-method元素和http-method-omission元素不能出现在相同的web-resource-collection元素里

auth-constraint子元素

auth-constraint元素指定那些用户角色可以访问该受保护的资源集合,通常,此元素应该包含一个或多个role-name元素,

  • 如果security-constraint元素下没有auth-constraint子元素,这表明任何身份的用户都可以访问相应的资源。
  • 如果security-constraint元素下有auth-constraint子元素,但是其内容为空,这表示所有身份的用户都被禁止访问相应的资源

实例:禁止访问特定目录下的资源

下面的web.xml文件的**security-constraint元素限制了所有JSP页面的访问由于auth-constraint不包含role-name元素,是一个空元素,则没有任何用户可以访问JSP页面**。

web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- 该元素用来限制资源的访问 -->
<security-constraint>
<!-- 需要限制访问的资源集合 -->
<web-resource-collection>
<web-resource-name>JSP pages</web-resource-name>
<!-- 需要限制访问的资源的URL的正则表达式 -->
<!-- 限制所有jsp页面的访问 -->
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<!-- 可以上述资源的角色列表 -->
<!-- 内容为空表示没有任何角色可以访问 -->
<auth-constraint />
</security-constraint>
</web-app>

1.jsp

该文件位于jsp页面下,在项目中的路径为:/app12a/WebContent/jsp/1.jsp

1
2
3
4
5
6
7
8
9
<!DOCTYPE HTML>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h2>Hello World</h2>
</body>
</html>

运行效果

现在我们在浏览器里输入这个URL来测试下:
http://localhost:8080/app12a/jsp/1.jsp
JSP页面是无法为访问到的,Servlet容器将发送一个HTTP 403错误给浏览器:表示拒绝访问请求的资源。
浏览器显示效果如下图所示:
这里有一张图片

测试auth-constraint元素

注释掉部署描述符web.xml中的auth-constraint元素,然后重启服务器(修改了web.xml需要重启服务器),再次访问1.jsp页面,现在是可以访问到该页面的,显示效果如下图所示:
这里有一张图片

参考资料

https://www.cnblogs.com/hongzai/articles/3296737.html
https://blog.csdn.net/u012045045/article/details/86612561