在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,回车。
此时浏览器会弹出一个窗口提示你输入用户名和密码,如下:
用户名和密码分别输入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