1、概述
?
在任何一种WEB应用开发中,不论大中小规模的,每个开发者都会遇到一些需要保护程序数据的问题,涉及到用户的LOGIN ID和PASSWORD。那么如何执行验证方式更好呢?实际上,有很多方式来实现。
下面将讨论在Tomcat中实现基本的(BASIC)和基于表单的(FORM-BASED)验证方式。它通过server.xml和web.xml文件提供基本的和基于表单的验证。
对于采用基于表单的(FORM-BASED)验证方式,只是要求在登录的JSP页面中的j_security_check 表单(for FORM-based) 需要两个参数:j_username和j_password。
对于用户的登录的名称和密码在Tomcat中可以以两种形式来存放,一是采用server.xml;另一种也可以采用用户自己的数据库表来存储。
?
2、设计系统中的各种人员的角色
?
(1)设计思想
?
l???????? 统一用户管理,实现基于角色、粗粒度(基于URL)和细粒度(基于应用组件的方法调用)的访问策略管理体系,
l???????? 基于分级角色的权限管理、统一证书管理和统一资源管理?
?
(2)设计目标
?
一般采用数据库表(对于复杂的也可以采用LDAP)记录每个系统用户的帐号信息、功能权限和数据权限信息,这样能够增加用户管理和权限设置的灵活性,同时也避免多个用户共用一个帐号的情况
?
(3)优点
?
l???????? 从用户角度来看,登录所有应用系统都使用唯一的用户名和口令(数字证书)同时在访问系统时,也只需要登录一次(单点登录全网漫游---SSO(Single Sign-On))。
l??????? 从管理者角度来看,提供了统一、集中、有效的用户管理。
?
七、在Tomcat中采用基于表单的安全验证
?
1、概述
?
(1)基于表单的验证
?
基于From的安全认证可以通过Tomcat Server对Form表单中所提供的数据进行验证,基于表单的验证使系统开发者可以自定义用户的登陆页面和报错页面。这种验证方法与基本HTTP的验证方法的唯一区别就在于它可以根据用户的要求制定登陆和出错页面。
通过拦截并检查用户的请求,检查用户是否在应用系统中已经创建好login session。如果没有,则将用户转向到认证服务的登录页面。但在Tomcat中的基于表单的验证凭证不被保护并以纯文本发送。
?
(2)在Tomcat 中的实现
?
在Tomcat中,用户、用户组和角色都是在XML配置文件(C:\jakarta-tomcat-5.0.19\conf\tomcat-users.xml)中指定的,我们只需要提供一个登陆页面,包含一个名为j_security_check的Form表单,一个名为j_username的TextBox和一个名为j_password的PasswordBox,然后在/WEB-INF/web.xml中配置即可使用Tomcat默认的JAAS身份验证。
使用JAAS验证的好处是,验证逻辑从页面中分离,对页面的限制访问是通过/WEB-INF/web.xml中的配置指定的,无需自定义过滤器。
?
(3)为了实现Web应用程序的安全,Tomcat Web容器执行下面的步骤:
?
l???????? 在受保护的Web资源被访问时,判断用户是否被认证。
l???????? 如果用户没有得到认证,则通过重定向到部署描述符中定义的注册页面,要求用户提供安全信任状。
l???????? 根据为该容器配置的安全领域,确认用户的信任状有效。
l???????? 判断得到认证的用户是否被授权访问部署描述符(web.xml)中定义的Web资源。
?
?
2、设计步骤?
?
(1)编写登录页面和错误处理页面:请见FormSafeWebApp 程序中的页面
?
(2)登录的页面文件的内容如下
?
基于FORM的用户认证要求你返回一个包括用户名和密码的HTML表单,这个表单相对应与用户名和密码的元素必须是j_username和j_password,并且表单的action描述必须为j_security_check(其实是一个Servlet)。该表单的具体操作以及j_username和j_password名字在Servlet中定义。当这个表单到达服务器的时候,由内部的Tomcat Server安全区对它进行确认。
?
包括这个表单的资源可以是一个HTML页面、一个JSP页面或者一个Servlet。你可以在<form-login-page>元素中定义。基于表单的认证能够使开发人员定制认证的用户界面。在web.xml的login-config标签项目定义了认证机制的类型、登录的URI和错误页面。
?
下面为该页面的内容:
?
?
<%@ page contentType="text/html; charset=GBK"%> <!-- 注意:action应该为j_security_check --> <html> <head> <title>在Tomcat 中采用Form 验证方式实现的安全Web应用程序的登录页</title> </head> <body bgcolor="#ffffff"> <form method="post" name="Login" action="j_security_check"> <table width="500" border="1" align="center"> <tr> <!-- 注意:用户名称和密码的输入应该为j_username 和j_password --> <td colspan="2"> <div align="center"> <strong>在Tomcat中采用</strong><strong>基于表单的安全验证的登录表单 </strong> </div> </td> </tr> <tr> <td width="224"> <div align="right"> 用户名称: </div> </td> <td width="260"> <input type="text" name="j_username"> </td> </tr> <tr> <td> <div align="right"> 密码: </div> </td> <td> <input type="password" name="j_password"> </td> </tr> <tr> <td> <div align="right"> <input type="submit" name="Submit" value="提交"> </div> </td> <td> <input type="reset" name="Submit2" value="重置"> </td> </tr> </table> </form> </body> </html>
?
?
(3)修改web.xml文件
?
?
<?xml version="1.0" encoding="UTF-8"?> 定义本Web应用的默认启始页面 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- Security is active on entire directory --> <security-constraint> <display-name> Tomcat Server Form Security Constraint </display-name> <web-resource-collection> <web-resource-name>Protected Area</web-resource-name> <description>A Page of Login Success</description> <url-pattern>/ProtectedDirOne/index.jsp</url-pattern> </web-resource-collection> <auth-constraint> 指定Form验证的用户的角色名称 <!-- Anyone with one of the listed roles may access this area --> <role-name>admin</role-name> </auth-constraint> 指定验证的方式为Form </security-constraint> <!-- Login configuration uses form-based authentication --> <login-config> <auth-method>FORM</auth-method> <realm-name> Tomcat Server Configuration Form-Based Authentication Area </realm-name> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/Error.htm</form-error-page> </form-login-config> </login-config> <!-- Security roles referenced by this web application --> <security-role> 关联Tomcat中的admin的角色 <description>The role is Administration</description> <role-name>admin</role-name> </security-role> </web-app>
?
?
(4)在C:\jakarta-tomcat-5.0.19\conf\tomcat-users.xml文件中配置admin的角色以及与该 admin角色相匹配的用户名称和密码
?
?
(5)执行该页面
在浏览器中直接输入受保护的页面的URL地址:
http://127.0.0.1:8080/FormSafeWebApp/ProtectedDirOne/,将出现要求登录的页面。
?
在表单中输入用户名称为admin(前面在tomcat-users.xml文件中所设置的某一用户名称),密码为12345678。然后点击“提交”,将出现如下页面
如果用户名称或者密码输入不正确,将出现如下的页面也就是错误页面
?
?
(6)在页面中获得当前登录成功后的用户名称和实体名称
?
利用request对象中的getRemoteUser()方法获得当前登录成功后的用户名称和利用getUserPrincipal()方法获得当前登录成功后的实体名称。