为tomcat页面设置访问权限(BASIC认证)

时间:2021-11-25 16:21:01

在web应用中,对页面的访问控制通常通过程序来控制,流程为:
登录 -> 设置session -> 访问受限页面时检查session是否存在,如果不存在,禁止访问

对于较小型的web应用,可以通过tomcat内置的访问控制机制来实现权限控制。采用这种机制的好处是,程序中无需进行权限控制,完全通过对tomcat的配置即可完成访问控制。

为了在tomcat页面设置访问权限控制,在项目的WEB-INFO/web.xml文件中,进行如下设置:

 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 5     id="WebApp_ID" version="2.5">
 6     <display-name>webAuthentification</display-name>
 7     <welcome-file-list>
 8         <welcome-file>index.html</welcome-file>
 9         <welcome-file>index.htm</welcome-file>
10         <welcome-file>index.jsp</welcome-file>
11         <welcome-file>default.html</welcome-file>
12         <welcome-file>default.htm</welcome-file>
13         <welcome-file>default.jsp</welcome-file>
14     </welcome-file-list>
15     <security-constraint>
16         <web-resource-collection>
17             <web-resource-name>admin</web-resource-name>
18             <url-pattern>/views/admin/*</url-pattern>
19         </web-resource-collection>
20         <auth-constraint>
21             <role-name>admin</role-name>
22         </auth-constraint>
23     </security-constraint>
24     <security-constraint>
25         <web-resource-collection>
26             <web-resource-name>user</web-resource-name>
27             <url-pattern>/views/user/*</url-pattern>
28         </web-resource-collection>
29         <auth-constraint>
30             <role-name>user</role-name>
31         </auth-constraint>
32     </security-constraint>
33 
34     <login-config>
35         <auth-method>BASIC</auth-method>
36         <realm-name>TOMCAT BASIC认证</realm-name>
37     </login-config>
38 
39     <security-role>
40         <role-name>admin</role-name>
41     </security-role>
42     <security-role>
43         <role-name>user</role-name>
44     </security-role>
45 </web-app>

 

其中,<url-pattern>中指定受限的url,可以使用通配符*,通常对整个目录进行访问权限控制。
<auth-constraint>中指定哪些角色可以访问<url-pattern>指定的url,在<role-name>中可以设置一个或多个角色名。

使用的角色名来自tomcat的配置文件${CATALINA_HOME}/conf/tomcat-users.xml。

<login-config>中设置登录方式,<auth-method>的取值为BASIC或FORM。如果为BASIC,浏览器在需要登录时弹出一个登录窗口。如果为FORM方式,需要指定登录页面和登录失败时的提示信息显示页面。

 

${CATALINA_HOME}/conf/tomcat-users.xml中添加下面的 角色和用户

 

1 <tomcat-users>
2     <role rolename="admin"/>
3     <role rolename="user"/>
4     <user username="admin" password="123456" roles="admin,user"/>
5     <user username="system" password="system" roles="admin"/>
6     <user username="user" password="user" roles="user"/>
7 </tomcat-users>

 

如上,共2个角色admin和 user。

3个用户,admin在角色admin和user下,system在admin角色下,user在user角色下。

 

我的测试工程有2个文件webAuthentification/views/admin/index.jsp和webAuthentification/views/user/index.jsp,用来测试admin和user这2个角色。

部署到tomcat,然后启动tomcat,并打开浏览器,输入http://localhost:8080/webAuthentification/views/admin/index.jsp,回车。

此时浏览器会弹出一个窗口提示你输入用户名和密码,如下:

为tomcat页面设置访问权限(BASIC认证)

用户名和密码分别输入admin/123456,确定。

访问admin/index.jsp页面Ok,页面显示:

Hello,Admin!!!
auth:Basic YWRtaW46MTIzNDU2
user:admin
pass:123456

 

那访问user/index.jsp呢?

页面显示:

Hello,user!!!

因为admin用户同时拥有admin和user的角色,所以都可以访问。

 

关闭浏览器,打开admin/index.jsp,输入system/system,

页面显示:

Hello,Admin!!!
auth:Basic c3lzdGVtOnN5c3RlbQ==
user:system
pass:system

 

再访问user/index.jsp:

页面显示:

HTTP Status 403 - Access to the requested resource has been denied

因为system用户没有user角色。

 

当然了,user用户就只能访问user/index.jsp。

 

附admin.jsp:

 1 <?xml version="1.0" encoding="GB18030" ?>
 2 <%@ page language="java" contentType="text/html; charset=GB18030"
 3     pageEncoding="GB18030"%>
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 5 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
 8 <title>Admin Index Page</title>
 9 </head>
10 <body>
11     Hello,Admin!!!
12     <br>
13     <%
14         String auth_user = null;
15         String auth = request.getHeader("Authorization");
16         String encoded = auth.substring(6);
17         sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder();
18         String decoded = new String(dec.decodeBuffer(encoded));
19         String[] userAndPass = decoded.split(":", 2);
20         auth_user = userAndPass[0];
21         session.setAttribute("user",auth_user);
22     %>
23     auth:<%=auth%><br>
24     user:<%=userAndPass[0] %><br>
25     pass:<%=userAndPass[1] %>
26 </body>
27 </html>

文章参考http://www.blogjava.net/asktalk/archive/2005/07/23/8221.html