前面“Tomcat JAASRealm 领域”章节介绍怎样实现和开启 Tomcat 的 JAASRealm 领域验证,没有单独创建一个 web 程序,而是直接使用 Tomcat 的 Manager 项目来验证 JAASRealm 是否可用。本章节将介绍怎样在我们自己的 web 程序中使用 JAASRealm 验证。
当我们访问由 Tomcat 部署的 Web 应用中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式。Tomcat 支持四种容器管理的安全防护,分别如下:
BASIC(基本验证):通过HTTP验证,需要提供 base64 编码文本的用户口令
DIGEST(摘要验证):通过HTTP验证,需要提供摘要编码字符串的用户口令
FORM(表单验证):在网页的表单上要求提供密码
CLIENT-CERT(客户端证书验证):以客户端证书来确认用户的身份
下面将介绍 BASIC 和 FORM 类型的验证方式,另外两种方式读者自行试验。
使用 IDEA 创建一个简单的 web 项目,项目结构如下图:

其中:
index.jsp 主页
login.jsp 登录页面
error.jsp 错误页面
web.xml Web项目配置文件
登录页面需要提供一个表单(form)表单的 action 必须是 “j_security_check”,提交方法为 post。并且,用户名输入框的 name 必须为 j_username,密码输入框的 name 必须为 j_password。html 代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form method="post" action="j_security_check">
<p>
用户名:<input type="text" name="j_username" />
</p>
<p>
密 码:<input type="password" name="j_password" />
</p>
<p>
<button type="submit">登录</button>
</p>
</form>
</body>
</html>错误页面用于显示简单的错误信息,html 代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>错误</title>
</head>
<body>
<p>用户名/密码不正确,登录失败!</p>
</body>
</html>主页只简单的显示标题信息,html代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>WEB_JAAS</title>
</head>
<body>
<h1>Web_JAAS</h1>
<p>
<a href="<%=request.getContextPath()%>/myServlet">获取当前日期</a>
</p>
</body>
</html>在 web.xml 文件中添加如下内容:
<security-constraint>
<display-name>default</display-name>
<!-- 需要限制访问的资源子集 -->
<web-resource-collection>
<web-resource-name>all files</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<!-- 指定可以访问该资源集合的用户角色,这里指定为 JAAS 中的角色 -->
<auth-constraint>
<role-name>manager-gui</role-name>
</auth-constraint>
<!-- 用来显示怎样保护在客户端和Web容器之间传递的数据 -->
<!-- NONE 不需要传输保证 -->
<!-- INTEGRAL 服务器和客户端之间的数据必须以某种方式发送,而且在传送中不能改变 -->
<!-- CONFIDENTIAL 传输的数据必须是加密的数据 -->
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<!-- 配置登录方式为 form 方式 -->
<login-config>
<!-- 指定验证方式 -->
<auth-method>FORM</auth-method>
<!-- 指定验证中使用的领域名,在 jaas.config 中配置的 -->
<realm-name>MyRealm</realm-name>
<form-login-config>
<!-- 指定登录页面 -->
<form-login-page>/login.jsp</form-login-page>
<!-- 指定错误页面 -->
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>保存配置且重启 tomcat 服务,访问 http://localhost:8080/web_jaas 地址将跳转到登录页面,如下图:

输入用户名和密码,点击登录按钮。进入主页面,如下图:

如果你想偷懒,不想编写登录页面,那么可以选择该种验证方式。当你访问受保护资源时,且没有登录授权,则浏览器会弹出用户名密码输入框。
首先,修改 web.xml 文件,如下:
<security-constraint>
<display-name>default</display-name>
<!-- 需要限制访问的资源子集 -->
<web-resource-collection>
<web-resource-name>all files</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<!-- 指定可以访问该资源集合的用户角色,这里指定为 JAAS 中的角色 -->
<auth-constraint>
<role-name>manager-gui</role-name>
</auth-constraint>
<!-- 用来显示怎样保护在客户端和Web容器之间传递的数据 -->
<!-- NONE 不需要传输保证 -->
<!-- INTEGRAL 服务器和客户端之间的数据必须以某种方式发送,而且在传送中不能改变 -->
<!-- CONFIDENTIAL 传输的数据必须是加密的数据 -->
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<!-- 配置登录方式为 BASIC 方式 -->
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>MyRealm</realm-name>
</login-config>保存配置且重启 tomcat 服务,访问 http://localhost:8080/web_jaas 地址将弹出登录对话框,如下图:
