实现Web应用程序的安 J2EE中,Web容器支持应用 | 全机制是Web应用程序的设计人 程序内置的安全机制。 | 员和编程人员必须面对的任务。在 |
Web应用程序的安全机 认证机制:基本认证、基于 数的Web应用程序都使用基 安全角色对应用程序的Web | 制有二种组件:认证和授权。基 表单的认证、相互认证。由于能 于表单的认证。Web容器使用在W 资源的访问进行授权。 | 于J2EE的Web容器提供三种类型的 够对认证用户界面进行定制,大多 eb应用程序的部署描述符中定义的 |
在使用基于表单的认证机制中,应用程序的设计人员和开发人员会遇到3类问题: |
·基于表单的认证如何 的,因为许多组织已经在数 | 与数据库和LDAP等其他领域的安 据库和LDAP表单中实现了认证机 | 全机制协同工作。(这是非常必要 制。) |
·如何在Web应用程序的部署描述符 | (web.xml)中增加或删除军政府的授权角色。 |
·Web容器在Web资源层次上进行授权 上的授权。 | ;应用程序则需要在单一的Web资源中执行功能层次 |
尽管有许多与基于表单 多数的应用程序都以自己的 | 的认证有关的文档和例子,但都 方式襀安全机制。 | 没有能够阐明这一问题。因此,大 |
本篇文章说明了基于表单的认证如何 协作的问题。它还解释了Web窗口如何使 角色,保护Web资源中的功能。 | 与其他方面的安全机制,尤其是数据库中的安全机制 用安全角色执行授权以及应用程序如何扩展这些安全 |
基于表单的认证能够使 了认证机制的类型、登录的 | 开发人员定制认证的用户界面。 URI和错误页面。 | web.xml的login-config小节定义 |
<auth-method>FORM</auth-method> |
<form-login-page>/ | login.jsp</form-login-page | > |
<form-error-page>/ | fail_login.html</form-error | -page> |
登录表单必须包含输入用户姓名和口 j_password,表单将这二个值发送给j_se | 令的字段,它们必须被分别命名为j_username和 curity_check逻辑名字。 |
<form method="POST" action="j_s | ecurity_check"> |
<input type="text" name="j_username"> |
<input type="passwo | rd" name="j_password"> |
除非所有的连接都是在 源被访问时,Web容器就会 | SSL上实现的,该表单能够透露 激活为该资源配置的认证机制。 | 用户名和口令。当受保护的Web资 |
为了实现Web应用程序的安全,Web容器执行下面的步骤: |
1、在受保护的Web资源被访问时,判断用户是否被认证。 |
2、如果用户没有得到认证,则通过 供安全信任状。 | 重定向到部署描述符中定义的注册页面,要求用户提 |
3、根据为该容器配置的安全领域,确认用户的信任状有效。 |
4、判断得到认证的用 | 户是否被授权访问部署描述符( | web.xml)中定义的Web资源。 |
象基本的安全认证机制 全区域。也就是说,它不明 安全区域认证用户方面引起 | 那样,在Web应用程序的部署描 确地定义用来认证用户的安全区 混淆。 | 述符中,基于表单的认证不指定安 域类型,这就会在它使用什么样的 |
由于数据库和LDAP在维护信息方面提 用它们维护安全认证和授权信息。 | 供了更大的灵活性,因此大多数组织都会希望继续使 |
许多Web窗口都支持不 Web容器中,server.xml将 | 同类型的安全区域:数据库、LD 数据库配置为其安全区域。 | AP和定制区域。例如,在Tomcat |
className="org.apache.catalina.r | ealm.JDBCRealm" |
driverName="oracle.j | dbc.driver.OracleDriver" |
connectionURL="jdbc: | oracle:thin:@{IPAddress}:{Po | rt}:{Servicename}" |
connectionName="{DB Username}" |
connectionPassword="{Password}" |
userRoleTable="user_roles" |
Tomcat的server.xml的<Realm>标 注意,容器对Web应用程序使用该区域, | 志定义了窗口用来识别一个用户的安全区域的类型。 应用程序的认证机制是基于表单的。 |
一旦用户被识别后,容 的<auth-constraint>标 容器会返回一个错误。 | 器就会得到认证用户的安全角色 志中定义的安全角色之一。如果 | ,看用户是否属于在部署描述符中 用户不属于任何一个安全角色,则 |
部署描述符(web.xml)的<securit 访问这些资源的安全角色清单。 | y-constraint>标志定义了被保护的Web资源和能够 |
<web-resource-collection> |
<web-resource-name>AdminPages | </web-resource-name> |
<description> acce | ssible by authorised users | </description> |
<url-pattern>/admin/*</url-pattern> |
<http-method>GET</http-method> |
</web-resource-collection> |
<description>These | are the roles who have acce | ss</description> |
<role-name>manager</role-name> |
Web窗口在网页层次上执行认证。然 进行认证,这会要求在应用程序中定义一 对功能的访问,应用程序需要理解角色的 | 而,商业性应用程序可能还希望对一个网页内的功能 些新的附加的与应用程序有关的安全角色。为了控制 权限概念。Web容器标准没有解决权限的问题。 |
由于授权角色是动态的,开发人员常 描述符中。为了使应用程序充分利用安全 色。因此,应用程序可以定义一个高层次 该角色中的所有用户都拥有能够访问Web | 常会感到迷惑,即这些安全角色是否需要添加到部署 支持,Web容器只需要在部署描述符中定义的一个角 的角色,然后将所有的用户都指派给该角色。这将使 资源的权限。 |
另外,应用程序还可以 由于应用程序已经配置有一 角色也就不需要在部署描述 现与指定应用程序有关的授 | 定义额外的角色,执行对一种We 个包含应用程序中所有用户的高 符中进行定义。这使得Web应用 权。 | b资源中较低层次的功能的授权。 层次安全角色,这些低层次的安全 程序能够利用容器的授权支持,实 |
我们可以在部署描述符 ,这使得管理员角色中的所 们可以在应用程序中创建 s | 中为所有用户定义一个高层次的 有用户都能够访问管理网页。为 ysadmin或appadmin等新的角色 | 管理员角色,保护管理类Web资源 了控制管理网页中的其他功能,我 。 |
应用程序可以对这些安 用这些权限来控制对其功能 | 全角色进行扩展,使它们拥有一 的访问。 | 定的权限。然后,应用程序可以使 |
尽管与特定应用程序相 isUserInRole方法中使用, | 关的安全角色不是定义在部署描 判断用户是否在这些安全角色中 | 述符中的,这些角色仍然可以在 。 |
·Web应用程序无需实现认证机制,简化Web应用程序的配置。 |
·Web应用程序能够使 规划的安全。 | 用getRemoteUser、IsUserInRol | e和getUserPrincipal方法实现有 |
该数据库表需要有username和password二个字段。 |
create table users (username var | char(20) not null, password(20) not null) |
该表维护着应用程序中角色的清单,它仅仅有rolename一个字段。 |
create table roles ( | rolename varchar(20) not nul | l) |
该表维护着一个用户和各个角色之间的关联,一个用户可以属于一个或多个角色。 |
create table user_ro not null) | les (username varchar(20) no | t null, rolename varchar(20) |
insert into users values('user1' | , 'password') |
insert into role values('manager') |
insert into user_rol | es values('user1', 'manager' | ) |
该数据库表需要有username和password二个字段。 |
create table users (username var | char(20) not null, password(20) not null) |
该表维护着应用程序中角色的清单,它仅仅有rolename一个字段。 |
create table roles ( | rolename varchar(20) not nul | l) |
该表维护着一个用户和各个角色之间的关联,一个用户可以属于一个或多个角色。 |
create table user_ro not null) | les (username varchar(20) no | t null, rolename varchar(20) |
insert into users values('user1' | , 'password') |
insert into role values('manager') |
insert into user_rol | es values('user1', 'manager' | ) |
9、通过将下面的信息拷贝到{tomcat (本例使用了薄客户端驱动程序,Tomcat | }conf文件夹的server.xml文件中,配置Tomcat。 使用内存区域作为缺省的安全区域。) |
className="org.apache.catalina.r | ealm.JDBCRealm" |
driverName="oracle.j | dbc.driver.OracleDriver" |
connectionURL="jdbc:oracle:thin: | @{IP address}:{Port}:{Servicename}" |
connectionName="{DB Username}" |
connectionPassword="{Password}" |
userRoleTable="user_roles" |
{IP Address} ━━数据库服务器的IP地址 |
10、将Oracle的薄客户机驱动程序JA {tomcat_home}/server/lib目录中。 | R文件或数据库的JDBC驱动程序拷贝到 |
11、用下面的安全约束配置Web应用程序的部署描述符 |
<web-resource-collection> |
<web-resource-name>Protected A | rea</web-resource-name> |
<url-pattern>/*</url-pattern> |
<http-method>DELETE</http-method> |
<http-method>GET</http-method> |
<http-method>POST</http-method> |
<http-method>PUT</http-method> |
</web-resource-collection> |
<role-name>manager</role-name> |
<user-data-constraint><transp | ort-guarantee> |
NONE</transport-guarantee></u | ser-data-constraint> |
<!-- 缺省的登录配置使用基于表单的认证 --> |
<auth-method>FORM</auth-method> |
<realm-name>Exampl | e Form-Based Authentication | Area</realm-name> |
<form-login-page>/ | jsp/login.jsp</form-login-p | age> |
<form-error-page>/jsp/error.js | p</form-error-page> |
需要注意的是,<auth-constraint 角色之一。 | >中<role-name>的值应当是用户-角色关联表中中 |
2、下载security-form-based.war文 | 件,并将它拷贝到Tomcat的webapps目录。 |
4、打开一个浏览器,输入下面的地 no}/security-form-based/protected/in | 址:http://{ip address:port dex.jsp |
配置Web应用程序的部 WebLogic的配置描述符之间 需要下面的小节: | 署描述符,这一过程与在Tomcat 的一个差别是,WebLogic配置描 | 中配置非常相似。Tomcat和 述符要求下面的小节,而Tomcat不 |
通过本篇文章,读者应该会对基于表 证有个比较深刻的认识。Web应用程序能 许使用以前的安全认证机制。 | 单的认证、以及它如何与数据库安全区域配合进行认 够利用基于表单的认证机制,保护它的资源,同时允 |
另外,本篇文章还描述了J2EE Web提 署描述符的情况下如何定义新的安全角色 | 供的授权支持层次,以及在不修改Web应用程序的部 。 |
原文链接地址:http://www.phome.net/document/java/200504/java111245707513683.html