Sun Java System Application Server 7 Web应用开发者指南

上一部分 | 目录 | 下一部分


Web应用安全性

该模块描述了如何为Sun Java System Application Server编写安全的Web应用,该应用带有能执行用户认证和存取特许的组件。

该模块包含下面几节:

Servlet的用户认证

Sun Java System Application Server支持J2EE规范V1.3需要的基于web的登录机制。该机制包括:

web.xml 部署描述文件文件中的login-config 元素描述了使用的认证方法,HTTP基本认证显示的应用域名和表单登录机制的属性。

login-config 元素语法如下:

<!ELEMENT login-config (auth-method?,realm-name?,form-login-config?)>


注意

login-config auth-method 子元素是可选的,但是如果没有它,服务器就使用默认的HTTP基本认证,这种认证方法并不很安全。


如果想获得关于web.xml 元素的更多信息,请参考第13章,Java Servlet规范v2.3的“部署描述文件”。

如果想获得sun-web.xml 元素的更多信息,请参考"装配和部署Web组件"

如果想获得编程登录的更多信息,请参考Sun Java System Application Server开发者指南。

HTTP基本认证

Sun Java System Application Server支持HTTP基本认证(RFC2068)。由于密码是通过base64 编码发送的,因此该认证类型并不很安全。为了保护传送中的密码,推荐在传送时使用SSL或其他相等的传送加密。

SSL相互认证

安全套接层协议(SSL) 3.0和执行基于证书的相互认证的方法是J2EE 规范 v1.3的需求。该安全机制提供了使用HTTP的用户认证(HTTP over SSL).

Sun Java System Application ServerSSL 相互认证机制 (叫做HTTP认证)支持下列密码组:

SSL_RSA_EXPORT_WITH_RC4_40_MD5
SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5
SSL_RSA_EXPORT_WITH_DES40_CBC_SHA
SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA
SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA
SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA

基于表单的登录

HTTP浏览器内嵌机制不能控制登录界面的外观和感觉。J2EE为登录引入了给标准HTML或基于Servlet/JSP的表单打包的能力。登录表单和web保护域相结合(HTTP) ,用来认证以前没有认证的用户。

由于没有加密就直接传送密码 (除非受到基本传送的保护),该认证类型不是非常安全。推荐在密码传送中,使用SSL或其他同等传送加密来保护密码。

为了确保能正确执行认证,登录表单”action” 域必须总是j_security_check

下面是一个HTML例子,显示了如何在HTML页面中编写该表单。

<form method="POST" action="j_security_check">
   <input type="text" name="j_username">
   <input type="password" name="j_password">
</form>

你可以指定表单的参数编码。如果想获得详细信息,请参考"parameter-encoding".

单点登录的用户认证

Sun Java System Application ServerservletJSP支持Sun ONE Application Server上的应用的单点登录。该性能允许需要相同用户单点登录信息的多个应用相互之间共享该信息,而不需要在各个应用中都进行用户登录。这些应用只需要认证用户一次,在需要这些认证信息的时候,就将这些信息广播给相应的程序。

联合航线订票服务是使用单点登录设想的一个例子应用程序,它查找所有的航线,并提供了到不同航线web站点的链接。一旦用户登录了联合订票服务,该用户信息就能被每个航线站点使用,而不需要用户再次登录。

单点登录操作遵守下列规则:

单点登录应用在配有相同域名和虚拟服务器的web应用。域由web.xml 文件中的realm-name 元素定义。如果想获得虚拟服务器的更多信息,请参考Sun Java System Application Server管理员指南或Sun Java System Application Server管理员配置文件参考。

  • 只要用户仅访问虚拟服务器上的web应用中没有保护的资源,就不需要认证它们。
  • 用户一旦访问了虚拟服务器上web应用中的任何受保护资源,用户就必须使用当前访问的web 应用定义的登录方法认证它们自己。
  • 一旦认证了,就使用该用户对应的角色来做出对所有相应web应用的访问控制决定,不需要用户 在每个应用中分别认证。
  • 用户退出某个web应用时(例如,如果使用了基于表单的登录,相应的会话无效或超时), 所有应用中的用户会话无效。下面访问任何应用中受保护的资源都要用户进行认证。

单点登录特性使用HTTP cookie来传送将每次的请求和保存的用户标识结合起来的标志。所以它只能使用在支持cookie的客户端环境中。

为了配置单点登录,设置server.xml 文件的virtual-server 元素的下列属性:

  • sso-enabled - 如果为false,该虚拟服务器就不允许单点登录,并且用户必须单独认证虚拟服务器 上的每个应用。默认值是true。
  • sso-max-inactive-seconds - 指定了多长时间没有接收到客户端活动之后,就可以清除用户的单点登录记录。 由于单点登录应用到相同虚拟服务器上的多个应用上,对任何应用的访问都使得单点登录记录处于活动状态。 默认值是5分钟(300秒)。值越高,单点登录持续的时间就越长,但是相应的服务器的开销就越高。
  • sso-reap-interval-seconds - 指定了清除过期的单点登录记录的时间间隔。默认值是60。

下面是一个配置的例子,使用的都是默认值:

<virtual-server id="server1" ... >
   ...
   <property name="sso-enabled" value="true"/>
   <property name="sso-max-inactive-seconds" value="300"/>
   <property name="sso-reap-interval-seconds" value="60"/>
</virtual-server>

Servlets的用户授权

可以配置Servlet,让它仅允许访问处于适当权限层的用户。该节涉及到下列主题:

定义角色

J2EE部署描述文件文件web.xml中定义角色,并将它们映射到相应的Sun Java System Application Server部署描述文件文件sun-application.xml (如果是单个部署的Web模块,就映射到 sun-web.xml )。如果想获得关于sun-web.xml的更多信息,请参考“装配和部署Web模块”。

sun-application.xml sun-web.xml 文件中的每个security-role-mapping 元素对应了web应用允许的主角或组的角色名。例如,单个部署web模块的sun-web.xml 文件包含下列内容:

<sun-web-app>
   <security-role-mapping>
      <role-name>manager</role-name>
      <principal-name>jgarcia</principal-name>
      <principal-name>mwebster</principal-name>
      <group-name>team-leads</group-name>
   </security-role-mapping>
   <security-role-mapping>
      <role-name>administrator</role-name>
      <principal-name>dsmith</principal-name>
   </security-role-mapping>
</sun-web-app>

注意,该例中的role-name 必须和相应的web.xml 文件中security-role 元素的role-name 相匹配。

注意,对于J2EE应用(EAR文件),必须在sun-application.xml 文件中指定映射到该应用模块地所有安全角色。对于单个部署的web模块,通常在sun-web.xml 文件中指定角色。角色可以映射到特定的主角或组(或两个都是)。使用的主角或组名必须是当前默认realm下的有效的主角或组。

定义Servlet授权约束

servlet层,使用web.xml 文件的auth-constraint 元素定义存取许可。

必须使用资源集合上的auth-constraint 元素来识别允许访问资源集合的用户角色。配置servlet授权约束请参照Servlet规范。

获取客户端证书

当你启动SSL并需要客户端证书认证时,servlet会访问客户端证书,如下所示:

if (request.isSecure()) {
   java.security.cert.X509Certificate[] certs;
   certs = request.getAttribute("javax.servlet.request.X509Certificate");
   if (certs != null) {
      clientCert = certs[0];
      if (clientCert != null) {
         //
获得用户识别名。
         java.security.Principal userDN = clientCert.getSubjectDN();
         ...
      }
   }
}

userDn 是完整的用户识别名。

SHTML和CGI的安全

为了安全,服务器分析的HTML标签和CGI脚本基于服务器安全配置。在服务器分析的HTML标签和CGI脚本中不能访问下列仅针对J2EE的安全属性:

  • J2EE域
  • J2EE角色
  • 基于表单的登录
  • 单点登录
  • 编程登录
  • J2EE授权约束

如果想获得服务器安全配置的更多信息,请参考Sun Java System Application Server管理员安全指南。


上一部分 | 目录 | 下一部分

 

常见问答
下载中心
产品简介
 
 
Solaris论坛
 
   
 
null