【IT168 技术文章】
采用HTTP基本的验证的例子
http基本验证是Web客户端验证的一种,它和系统的授权机制一起控制受保护资源的访问。
步骤:
1. 创建一个j2ee应用
在应用程序部署工具的File菜单选中New子菜单中的Application菜单项(见图1)。会弹出新建应用程序对话框。填写应用程序文件名和应用程序显示名(见图2)。
图1
图2
2. 创建一个web组件
在应用程序部署工具的File菜单选中New子菜单中的Web Compent菜单项,会弹出新建web组件向导对话框(见图3)。选择Create New WAR File in Application,在下拉框中选择步骤1创建的应用test,在WAR Display Name框中填写WebAppTest.点击Content栏中的Eidt按钮选择此Web组件包含的文件。在这个例子中只有一个webtest.jsp文件。然后点击Next,进入下一个对话框(见图4)。由于我们的web组件是一个jsp文件,因此在组件类型中选择JSP。然后一直按Next直到结束。此时我们已经创建了一个只包含一个jsp文件的web组件。接下来是配置安全属性的步骤。
图3
图4
3. 配置安全属性
3.1创建安全角色
在部署工具的左导航栏中点中步骤2创建的web组件WebAppTest,在右边的属性页中选择Roles属性页(见图5)。点击Add按钮,在Name栏中填写安全角色名user,Description栏填写描述信息。安全角色代表具有相同安全权限用户的集合。
图5
3.2 配置安全策略
创建了安全角色后,应该对安全角色配置相应的安全策略。点击Security属性页(见图6)。
图6
首先选择你想用的验证方式,从User Authentication Method下拉框中选择Basic。这意味着你将通过基本的HTTP验证方式验证用户。下面我们进行web资源的授权。点击Security Constraint栏中的Add按钮添加一条安全约束,约束名可以自定。接下来对创建好的约束添加Web资源。首先在Web Resource Collections中添加资源集合,然后选取资源集合包含的资源。此例中WRCollection资源集合中包含webtest.jsp文件,也可以包含各种属于这个web组件的文件。接下来选择哪些web操作要收到约束,j2sdkee1.3.1中只包含两种操作(GET和POST),不同的产品支持的操作有所不同,在开发是应结合具体产品提供的操作来选取。现在应该指定安全角色了,点击Authorized Roles栏中的Edit按钮,会弹出安全角色列表对话框,从中选取已定义的安全角色。本例中选择user。至此安全策略已经配置完毕,下面的步骤是将实际环境中的用户和用户组映射与安全角色进行映射。
4. 映射
在左导航栏中选中应用程序test在右边选择Security属性页(见图7),在Role Name Reference栏中选中user,点击正下方的Add按钮,会弹出用户和用户组列表对话框,从中选择要映射成安全角色user的用户或组。此例中我们将用户j2ee映射为安全角色user。这样用户J2ee将具有为安全角色user分配的访问授权。
图7
5. 部署应用
选中Web Context属性页,在Context Root文本框中填写test,右键点击左导航栏的应用test,在弹出菜单中选择deploy完成应用程序的发布。至此我们完成了第一个例子的全部步骤。
部署描述文件
这个例子使用了说明性的安全服务,因此我们不需要编写任何的安全相关的代码,而是完全通过配置组件的部署描述文件来实现的。下面是这个web组件的部署描述文件。
2 <!DOCTYPE web-app PUBLIC
3 '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
4 'http://java.sun.com/dtd/web-app_2_3.dtd'>
5 <web-app>
6 <display-name>WebAppTest</display-name> //Web组件名称
7 <servlet>
8 <servlet-name>webtest</servlet-name>
9 <display-name>webtest</display-name>
10 <jsp-file>/webtest.jsp</jsp-file> //组件中包含的jsp文件
11 </servlet>
12 <session-config>
13 <session-timeout>30</session-timeout>
14 </session-config>
15 <security-constraint> //安全约束部分
16 <web-resource-collection> //受约束的web资源集
17 <web-resource-name>WRCollection</web-resource-name> //资源集名
18 <url-pattern>/webtest.jsp</url-pattern> //资源的url表达式
19 <http-method>GET</http-method> //受约束的资源操作方法
20 <http-method>POST</http-method>
21 </web-resource-collection>
22 <auth-constraint> //对安全角色授权
23 <role-name>user</role-name> //安全角色名
24 </auth-constraint>
25 <user-data-constraint>
26 <transport-guarantee>NONE</transport-guarantee>
27 </user-data-constraint>
28 </security-constraint>
29 <login-config> //验证方式设置
30 <auth-method>BASIC</auth-method> //使用基本的HTTP验证方式
31 <realm-name></realm-name>
32 </login-config>
33 <security-role> //定义安全角色
34 <description>this is a user</description>
35 <role-name>user</role-name>
36 </security-role>
37 </web-app>
38
从部署描述文件可以知道这是一个名为WebAppTest的web组件,包含一个名为webtest.jsp的文件,只有被赋予user安全角色的用户或用户组才有权对webtest.jsp进行GET或POST操作。这里并没有包含安全角色对实际用户的映射,j2ee部署描述文件的DTD中并没有定义用于安全角色和实际用户的映射的元素,因为实际环境中有多种不同的用户系统(如关系数据库,系统文件形式和LDAP系统等)。因此安全角色和实际用户的映射方式是由j2ee产品厂商制定的。
测试运行结果
打开ie,在导航栏输入http://localhost:8000/test/webtest.jsp回车,会弹出验证对话框,要求用户提供用户名和密码(见图8),输入用户名j2ee和密码j2ee。通过用户验证后执行jsp文件,webtest.jsp打印出"hello!"(见图9)。
图8
图9
注释:在第一个例子中已经详细的描述了各个步骤,在接下来的例子中会有一些与第一个例子相同的操作,因此对下面的例子只描述与第一个例子不同的步骤。
基于表单的验证的例子
基于表单的验证与基本的HTTP验证的唯一区别是基本的HTTP验证用浏览器提供的验证信息对话框收集用户验证信息,而基于表单的验证允许自定义登陆页面来收集用户验证信息。本例子与第一个例子的步骤基本相同,不同的地方在于此例子要提供登陆页面和出错页面。
登陆页面login.html
2 <input type=text name="j_username">
3 <input type=password name="j_password">
4 <input type=submit name="login" value="login">
5 </form>
6
此文件有几个地方值得注意:
Action的值必须为"j_security_check"
获取用户名的域名必须是"j_username"
获取用户密码的域必须是" j_password"
出错页面 error.html
2 用户名或密码不正确!
3 </html>
4
出错页面只是简单的显示出错信息。
配置基于表单的验证
首先将login.html和error.html加入到WebAppTest组件中。
然后见图10选择Security属性页,在User Authentication Method下拉框中选择Form Based选项。点击Settings…弹出用户验证设置对话框,在Login Page下拉框选login.html,在Error Page下拉框选error.html。
图10
重新部署应用,再一次访问http://localhost:8000/test/webtest.jsp 会出现login页面(见图11),如果用户名或密码错误,error.html将显示给用户。
图11
部署描述文件
2 <!DOCTYPE web-app PUBLIC
3 '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
4 'http://java.sun.com/dtd/web-app_2_3.dtd'>
5 <web-app>
6 <display-name>WebAppTest</display-name>
7 .
8 .
9 .
10 <transport-guarantee>NONE</transport-guarantee>
11 </user-data-constraint>
12 </security-constraint>
13 <login-config>
14 <auth-method>FORM</auth-method> //使用基于表单的验证方式
15 <realm-name>Default</realm-name> //使用缺省的安全域
16 <form-login-config>
17 <form-login-page>/login.html</form-login-page> //定义登陆页面
18 <form-error-page>/error.html</form-error-page> //定义出错页面
19 </form-login-config>
20 </login-config>
21 <security-role>
22 <description>this is a user</description>
23 <role-name>user</role-name>
24 </security-role>
25 </web-app>