You can secure a Web Application by using authentication, by restricting access to certain resources in the Web Application, or by using security calls in your servlet code. Several types of security realms can be used. Security realms are discussed in the document Security Fundamentals. Note that a security realm is shared across multiple virtual hosts.
可以通过认证、限制访问WEB应用程序中的某些资源或在servlet代码中使用安全调用来保护应用程序。有几种安全域(security realm)类型可以使用。文档安全性基本原理讨论了安全域。注意安全域在多个之间是共享的。
设置WEB应用程序安全认证
在WEB应用程序部署描述符中使用<login-config>元素来定义WEB应用程序的安全认证。在这个元素中,可以定义包含用户证书、认证方法、需认证资源的位置的安全域。关于建立安全域的信息参考安全性基本原理。
要建立WEB应用程序安全认证:
1. 选择一个认证方法。可选项有:
BASIC
Basic认证用WEB浏览器显示用户名/密码对话框。这个用户名和密码通过域被认证。
FORM
基于Form的认证要求返回一个包含用户名和密码的HTML表单。从表单元素返回的字段必须是j_username和j_password,action属性必须是j_security_check。下面是使用FORM认证的HTML代码示例:
<form method="POST" action="j_security_check">
<input type="text" name="j_username">
<input type="password" name="j_password">
</form>
用来产生HTML表单的资源可能是一个HTML页面,一个JSP,或一个servlet。使用<form-login-page>元素来定义这个资源。
当提供login页面服务时,就会建立HTTP会话对象。因此,当认证成功后在页面调用session.isNew()方法会返回FALSE。
CLIENT-CERT
使用客户端证书来进行认证请求。更多信息参考配置SSL协议。
2. 如选择FORM认证,也需定义用来产生HTML页面的资源位置和响应认证失败的资源。有关配置FORM认证的说明参考<login-config>。
3. 定义要认证的域。如未指定一个特定的域,就会使用这样一个域,这个域定义在管理控制台的Web Application->Configuration->Other标签的Auth Realm Name字段中。更多信息参考<login-config>。
多个WEB应用程序,Cookies和安全认证
默认地,Weblogic服务器给所有WEB应用程序分配相同的cookie名称(JSESSIONID)。不管使用何种类型的认证,所有使用相同cookie名称的WEB应用程序使用单个认证认定方式。一旦用户被认证,对于任何使用相同cookie名称的WEB应用程序的请求,认证都是有效的。将不会再次提示用户认证。
如要求WEB应用程序单独认证,就要为WEB应用程序指定一个唯一的cookie名称。用Weblogic特有部署描述符weblogic.xml中的<session-descriptor>元素的CookieName参数指定cookie名称。更多信息,参考session-descriptor元素。
限制访问WEB应用程序的资源
可以为WEB应用程序中指定的资源(servlets,JSPs,或HTML页面)应用安全约束。要应用安全约束:
1. 定义一个被映射到安全域中一个或多个成员的角色。在WEB应用程序部署描述符的<security-role>元素中定义角色。然后将这些角色映射到域中的成员上,用<security-role-assignment>元素(参考Weblogic特有部署描述符weblogic.xml)。
2. 使用嵌套在<web-resource-collection>元素里的<url-pattern>元素来定义要应用安全约束的WEB应用程序资源。<url-pattern>可以是一个目录,文件名或一<servlet-mapping>。
要对整个WEB应用程序应用安全约束,使用如下<url-pattern>:
<url-pattern>/*</url-pattern>
3. 使用嵌套在<web-resource-collection>元素里的<http-method>元素定义要应用安全约束的HTTP 方法(GET或POST)。
4. 使用嵌套在<user-data-constraint>元素里的<transport-guarantee>元素定义在客户端和服务器之间通信是否使用SSL。
Listing 8-6 限制资源的示例
web.xml entries:
<security-constraint>
<web-resource-collection>
<web-resource-name>SecureOrdersEast</web-resource-name>
<description>
Security constraint for resources in the orders/east directory
</description>
<url-pattern>/orders/east/*</url-pattern>
<http-method>POST</http-method>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<description>constraint for east coast sales</description>
<role-name>east</role-name>
<role-name>manager</role-name>
</auth-constraint>
<user-data-constraint>
<description>SSL not required</description>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
...
<security-role>
<description>east coast sales</description>
<role-name>east</role-name>
</security-role>
<security-role>
<description>managers</description>
<role-name>manager</role-name>
</security-role>
weblogic.xml entries:
<security-role-assignment>
<role-name>east</role-name>
<principal-name>tom</principal-name>
<principal-name>jane</principal-name>
<principal-name>javier</principal-name>
<principal-name>maria</principal-name>
</security-role-assignment>
<security-role-assignment>
<role-name> manager </role-name>
<principal-name>peter</principal-name>
<principal-name>georgia</principal-name>
</security-role-assignment>
在servlets编程中使用用户和角色
在servlet代码编程中访问用户和角色,使用javax.servlet.http.HttpServletRequest.isUserInRole(String role)方法。字符串role被映射到嵌套在一个WEB应用程序部署描述符的<servlet>声明上的<security-role-ref>元素里的<role-name>元素提供的名字上。<role-link>元素映射到一个定义在WEB应用程序描述符的<security-role> 元素的<role-name>上。
例如:
Listing 8-7 安全角色映射示例
Servlet code:
isUserInRole("manager");
web.xml entries:
<servlet>
. . .
<role-name>manager</role-name>
<role-link>mgr</role-link>
. . .
</servlet>
<security-role>
<role-name>mgr</role-name>
</security-role>
weblogic.xml entries:
<security-role-assignment>
<role-name>mgr</role-name>
<principal-name>al</principal-name>
<principal-name>george</principal-name>
<principal-name>ralph</principal-name>
</security-role-ref>
配置WEB应用程序的外部资源
当访问外部资源(如通过JNDI的WEB应用程序的DataSource)时,可以映射要在代码中查找的JNDI名称到绑定在JNDI树上的实际JDNI名称。使用web.xml和weblogic.xml部署描述符来建立这个映射,这样就允许不必改变应用程序代码就能改变这些资源。提供一个Java代码中使用的名称,绑定在JNDI树里的资源名称,资源的Java类型,并指定是通过servlet编程处理资源安全性,还是应用与HTTP请求相关的证书。
要配置外部资源:
1. 在部署描述符中登记将在代码中使用的资源名称、Java类型和安全认证类型。有关建立部署描述符条目的指示参考外部资源参考。
2. 映射资源名到JNDI名称。有关建立部署描述符条目的指示参考映射外部资源。
下例中假设你已定义一个名为accountDataSource的数据源。有关更多信息参考JDBC数据源。
Listing 8-8 使用DataSource的示例
Servlet code:
javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("myDataSource");
web.xml entries:
<resource-ref>
. . .
<res-ref-name>myDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>CONTAINER</res-auth>
. . .
</resource-ref>
weblogic.xml entries:
<resource-description>
<res-ref-name>myDataSource</res-ref-name>
<jndi-name>accountDataSource</jndi-name>
</resource-description>
在WEB应用程序中引用EJBs
在WEB应用程序中引用EJBs,必须给出它们在WEB应用程序部署描述符里的名称,这个名称已被映射到EJB的JNDI名称,EJB的JNDI名称在weblogic-ejb-jar.xml部署描述符文件中定义。
要在WEB应用程序中配置使用EJBs:
1. 登记在代码中用来查找EJB的EJB引用名称,Java类名,在WEB应用程序部署描述符中的<ejb-ref>元素的EJB本地和远程接口的类名。更多有关建立部署描述符条目的指示参考EJBs资源参考。
2. 映射定义在Weblogic特有的部署描述符weblogic.xml的<ejb-reference-description>元素的引用名称到定义在weblogic-ejb-jar.xml 文件里的JNDI名称。更多有关建立部署描述符条目的指示参考映射EJB资源。
如WEB应用程序是企业应用程序包(.ear文件)的一部分,就可以通过在.ear中用<ejb-link>元素定义的名称来引用EJB。
设置会话管理
默认地,已经建立Weblogic服务器处理会话跟踪。你不必建立使用会话跟踪的任何属性。但是,配置Weblogic服务器如何管理会话是调整应用程序以提升性能的关键部分。调整依赖于以下因素:
· 希望命中servlet的用户数
· 命中servlet的并发用户数
· 一个会话持续的时间
· 希望为每个用户保存多少数据。
会话属性
用Weblogic特有的部署描述符中的属性来配置Weblogic服务器会话跟踪。有关编辑Weblogic特有部署描述符的指示参考定义会话参数。
会话超时
可指定HTTP会话终止的时间间隔。当会话终止时,保存在会话中的所有数据将被丢弃。用如下两个方法的一个来设置时间间隔:
· 设置weblogic特有部署描述符weblogic.xml的<session-descriptor> 元素的TimeoutSecs属性。这个值以秒为单位。
· 设置WEB应用程序描述符web.xml里的<session-timeout>元素。这个值以分钟为单位,并覆盖TimeoutSecs属性(在Weblogic特有的部署描述符的<session-descriptor>元素中)设置的值。
配置会话cookies
当客户端浏览器支持时,Weblogic服务器使用cookies进行会话管理。
Weblogic服务器用来跟踪会话的cookies默认被设置为临时的,不会超过浏览器的生命期而存在。当用户离开浏览器时, cookies就会丢失,并且认为会话生命期已经结束。这种行为是会话使用的精髓,推荐这种使用会话的方式。
可能要用在Weblogic特有部署描述符(weblogic.xml)里定义的属性来配置跟踪会话的cookies许多方面,参考会话和cookie相关属性的完整列表。
有关编辑Weblogic特有的部署描述符的说明,参考定义会话参数。
使用较长生命期的Cookies
对于较长生命期的、客户端的用户数据,应用程序应通过HTTP servlet API在浏览器建立和设置自己的cookies,但不要试图使用同HTTP会话相关联的cookies。应用程序可能用cookie来自动登录一个特定机器上的用户,在这种情况下,应建立一个新的持续长时间的cookie。记住只能从客户端机器传送cookie。如用户必须从多个位置访问应用程序,那么应用程序应将数据保存在服务器上。
不能将浏览器cookie的生命期与一个会话生命期直接连接起来。如一个cookie在与它相关联的会话前过期,那个会话就会成为孤会话。如会话在与它相关联的cookie之前过期,那么servlet就不能找到会话。在那点上,当调用getSession()方法时,就会指派一个新会话。你应当只临时使用会话。
配置会话持久性
以下是会话持久性的四个不同实现方法:
· 内存(单服务器,不复制)
· 文件系统持久性
· JDBC持久性
· 内存内复制(在集群中)
前三个在这儿讨论;内存内复制(in-memory replication)在理解HTTP会话状态复制中讨论。
对于文件,JDBC和内存内复制,需设置附加的包含PersistentStoreType的属性。每一方法有它自己的属性集,如下:
公共属性
通过设置Weblogic特有部署描述符(weblogic.xml)中的以下属性,来配置会话的数量。这些特性只在使用会话持久性时才适用:
CacheSize
限制同时在内存中保持活动的缓存会话数目。如希望有大量的并发活动会话,不要使这些会话耗尽服务器的RAM,因为这也许会导致虚拟内存交换的性能问题。当缓存充满时,最近最少使用的会话就会被保存到持久性存贮器中,它在被请求时自动被重新调用。当不使用持久性时,这个属性被忽略,并且不会有允许在主内存中存在的会话数量的软限制。默认地,缓存会话数为1024。最小是16,最大是Integer.MAX_VALUE。一个空会话至少使用100字节,并随着它数据的增长而增长。
SwapIntervalSecs
当达到cacheEntries限制时,将最近最少使用的会话从缓存中清除并保存到持久性存贮器之间服务器等待的时间间隔。
如未设置,这个属性默认是10秒;最小1 秒,最大604800(1星期)。
InvalidationIntervalSecs
Sets the time, in seconds, that WebLogic Server waits between doing house-cleaning checks for timed-out and invalid sessions, and deleting the old sessions and freeing up memory. Set this parameter to a value less than the value set for the <session-timeout> element. Use this parameter to tune WebLogic Server for best performance on high traffic sites.
设置Weblogic服务器在检查超时、失效会话与清除旧会话释放内存之间等待的时间,以秒为单位。这个参数值不能小于<session-timeout>元素设置的值。用这个参数来调整Weblogic服务器,以在高度拥挤时获得最佳性能。
最小值是每秒(1)一次,最大值是每星期(604800秒)一次。如未设置,参数默认是60秒。
在WEB应用程序部署描述符web.xml的<session-config>元素中设置<session-timeout>。
使用基于内存、单服务器、无复制的持久性存贮器
要使用基于内存、单服务器、无复制的持久性存贮器,将属性PersistentStoreType设为memory。当使用基于内存的存储器时,所有会话信息都保存在内存中,在停止和重启Weblogic服务器时会丢失。
使用基于文件的持久存储器
对于会话有基于文件的存储器:
1. 将PersistentStoreType设为file。
2. 设置Weblogic服务器存储会话的目录。有关设置这个目录的更多信息,参考PersistentStoreDir。
如没有给这个属性明确设置值,Weblogic服务器就会为你建立一个临时目录。
如在集群中使用基于文件的持久性,就必须明确地将此属性值设置为一个集群中所有服务器都能访问的共享目录。你必须自己建立这个目录。
使用数据库作为持久性存储器
对于会话的基于JDBC持久性存储器:
1. 要设置JDBC为持久存储方式,将属性PersistentStoreType设为jdbc。
2. 用属性PersistentStorePool设置持久性存储器使用的JDBC连接池。使用在Weblogic服务器管理控制台定义的连接池名称。
有关设置数据库连接池更多的细节参考管理JDBC连接。
3. 设置与相对于有权限用户的连接的ACL(访问控制表)。有关建立数据库连接的更多细节参考管理JDBC连接。
4. 为基于JDBC持久性建立一个名为wl_servlet_sessions的数据库表。连接到此数据库的连接池需有对此表的读/写权限。下表列示了在建立此表时应使用的列名和数据类型:
Table 8-4 wl_servlet_sessions表
Column name Type
wl_id Variable-width alphanumeric column, up to 100 characters; for example, Oracle VARCHAR2(100).The primary key must be set as follows:wl_id + wl_context_path.
wl_context_path Variable-width alphanumeric column, up to 100 characters; for example, Oracle VARCHAR2(100). This column is used as part of the primary key. (See the wl_id column description.)
wl_is_new Single char column; for example, Oracle CHAR(1)
wl_create_time Numeric column, 20 digits; for example, Oracle NUMBER(20)
wl_is_valid Single char column; for example, Oracle CHAR(1)
wl_session_values Large binary column; for example, Oracle LONG RAW
wl_access_time Numeric column, 20 digits; for example, NUMBER(20)
wl_max_inactive_interval Integer column; for example, Oracle Integer. Number of seconds between client requests before the session is invalidated. A negative time value indicates that the session should never timeout.
如正在使用Oracle DBMS,可使用如下的SQL语句建立wl_servlet_sessions表:
create table wl_servlet_sessions
( wl_id VARCHAR2(100) NOT NULL,
wl_context_path VARCHAR2(100) NOT NULL,
wl_is_new CHAR(1),
wl_create_time NUMBER(20),
wl_is_valid CHAR(1),
wl_session_values LONG RAW,
wl_access_time NUMBER(20),
wl_max_inactive_interval INTEGER,
PRIMARY KEY (wl_id, wl_context_path) );
可用DBMS来修改执行的SQL语句。
注意:可以配置JDBC会话持久性在装载会话数据失败(用JDBCConnectionTimeoutSecs属性)之前等待连接池中JDBC连接的持续时间。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/