前面“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 地址将弹出登录对话框,如下图: