将声明性安全用于 Web 应用程序

 

下列主题描述了在 web.xmlweblogic.xml 文件中用于定义 Web 应用程序的安全要求的部署描述符元素:

web.xml 部署描述符

WebLogic Server 支持以下与 web.xml 安全相关的部署描述符元素:

auth-constraint

可选的 auth-constraint 元素定义哪些组或委托人有权访问在此安全约束中定义的 Web 资源集合。

下表描述可以在 auth-constraint 元素中定义的元素。

表 3-1 auth-constraint 元素
元素
必需/
可选
描述
<description>
可选
此安全约束的文字描述。
<role-name>
可选
定义哪些安全角色可以访问在此 <security-constraint> 中定义的资源。使用 <security-role-ref> 元素将安全角色名称映射到委托人 请参阅 security-role-ref

 

使用位置

security-constraint 元素中使用 auth-constraint 元素。

示例

有关如何在 web.xml 文件中使用 auth-constraint 元素的示例,请参阅清单 3-10

security-constraint

security-constraint 元素在 web.xml 文件中用于定义对 web-resource-collection 元素定义的资源集合的访问权限。

下表描述可在 security-constraint 元素中定义的元素。

表 3-2 security-constraint 元素
元素
必需/
可选
描述
<web-resource-
collection>
必需
定义应用此安全约束的 Web 应用程序的组件。有关详细信息,请参阅 web-resource-collection
<auth-constraint>
可选
定义哪些组或委托人有权访问在此安全约束中定义的 Web 资源的集合。有关详细信息,请参阅 auth-constraint
<user-data-
constraint>
可选
定义应如何保护客户端和服务器之间的通信数据。有关详细信息,请参阅 user-data-constraint

 

示例

清单 3-10 说明如何使用 security-constraint 元素定义 web.xml 文件中的 SecureOrdersEast 资源安全。

清单 3-10 安全约束示例
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

security-role 元素包含安全角色的定义。该定义包含安全角色的可选描述和安全角色名称。

下表描述可在 security-role元素中定义的元素。

表 3-3 security-role 元素
元素
必需/
可选
描述
<description>
可选
此安全角色的文字描述。
<role-name>
必需
角色名。此处使用的名称在 WebLogic 特定的部署描述符 weblogic.xml 中必须有对应的条目,该部署描述符将角色映射到安全领域中的委托人。有关详细信息,请参阅 security-role-assignment

 

示例

有关如何在 web.xml 文件中使用 security-role 元素的示例,请参阅清单 3-13

security-role-ref

security-role-ref 元素将 <security-role> 定义的安全角色名链接到使用 Servlet 逻辑进行硬编码的备用角色名。使用此附加提取层,可以在部署时配置 Servlet,且不必更改 Servlet 代码。

下表描述可在 security-role-ref元素中定义的元素。

表 3-4 security-role-ref 元素
元素
必需/
可选
描述
<description>
可选
角色的文字描述。
<role-name>
必需
定义在 Servlet 代码中使用的安全角色或委托人的名称。
<role-link>
必需
定义稍后将在部署描述符中的 <security-role> 元素中定义的安全角色的名称。

 

示例

有关如何在 web.xml 文件中使用 security-role-ref 元素的示例,请参阅清单 3-16

user-data-constraint

user-data-constraint 元素定义应如何保护客户端和服务器之间的通信数据。

下表描述了可以在 user-data-constraint 元素中定义的元素。

表 3-5 user-data-constraint 元素
元素
必需/
可选
描述
<description>
可选
文字描述。
<transport-
guarantee>
必需
指定客户端和服务器之间的通信的数据安全要求。
值范围:
NONE- 应用程序不需要任何传输保证。
INTEGRAL- 应用程序要求数据在客户端和服务器之间传输的过程中不会被更改。
CONFIDENTIAL- 应用程序要求传输数据以防止其他实体观察到传输的内容。
当使用 INTEGRALCONFIDENTIAL 传输保证对用户进行身份验证时,WebLogic Server 会建立安全套接口层 (SSL) 连接。

 

使用位置

security-constraint 元素中使用 user-data-constraint 元素。

示例

有关如何在 web.xml 文件中使用 user-data-constraint 元素的示例,请参阅清单 3-10

web-resource-collection

web-resource-collection 元素标识了一个资源子集,以及在 Web 应用程序中针对这些资源且将应用安全约束的 HTTP 方法。如果未指定 HTTP 方法,则该安全约束应用于所有 HTTP 方法。

下表描述了可以在 web-resource-collection 元素中定义的元素。

表 3-6 web-resource-collection 元素
元素
必需/
可选
描述
<web-resource-name>
必需
此 Web 资源集合的名称。
<description>
可选
Web 资源的文字描述。
<url-pattern>
必需
Web 资源集合的映射或位置。
URL 模式必须使用在 JSR-000154 Java Servlet Specification Version 2.4的 11.2 节中定义的语法。
模式 <url-pattern>/</url-pattern> 将安全约束应用于整个 Web 应用程序。
<http-method>
可选
当客户端尝试访问 Web 资源集合时应用安全约束的 HTTP 方法。如果未指定 HTTP 方法,则安全约束应用于所有 HTTP 方法。

 

使用位置

security-constraint 元素中使用 web-resource-collection 元素。

示例

有关如何在 web.xml 文件中使用 web-resource-collection 元素的示例,请参阅清单 3-10

weblogic.xml 部署描述符

WebLogic Server 支持以下与 weblogic.xml 安全相关的部署描述符元素:

有关 weblogic.xml 部署描述符的其他信息,请参阅使用 WebLogic Server 开发应用程序 中的 XML 部署描述符 部分。

有关 weblogic.xml 元素的其他信息,请参阅开发 WebLogic Server 的 Web 应用程序、Servlet 和 JSP中的 weblogic.xml 部署描述符元素

externally-defined

externally-defined 元素使您可以明确指出,希望由 web.xml 部署描述符的 role-name 元素定义的安全角色使用在管理控制台指定的映射。通过该元素,您可以不必为在特定 Web 应用程序的部署描述符中定义的每个安全角色指定特定的安全角色映射。所以,在同一安全领域中,部署描述符可用于指定和修改某些应用程序的安全性,而管理控制台可用于指定和修改其他应用程序的安全性。

服务器的角色映射行为取决于在管理控制台上选择哪个安全部署模型。有关安全部署模型的信息,请参阅“使用角色和策略确保 WebLogic 资源安全”中的用于确保 Web 应用程序和 EJB 资源安全的选项

注意:指定安全角色名称时,请遵循以下约定和限制:
  • 安全角色名称的正确语法与可扩展标记语言 (XML) 建议中对 Nmtoken 定义的语法(可从 Web 上获取,网址为 http://www.w3.org/TR/REC-xml#NT-Nmtoken)相同。
  • 不要使用空格、逗号、连字符或以下逗号分隔列表中的任何字符:/t、< >、#、|、&、~、?、( )、{ }。
  • 安全角色名区分大小写。
  • BEA 建议对安全角色名使用以下约定:它们应该独一无二。
使用位置

security-role-assignment 元素中使用 externally-defined 元素。

示例

清单 3-11清单 3-12 以比较的形式说明如何在 weblogic.xml 文件中使用 externally-defined 元素。在 清单 3-12 中,指定 weblogic.xml 中的“webuser” externally-defined 元素的规范意味着,要针对 getReceipts 方法正确配置安全,必须在管理控制台中为 webuser 创建委托人。

注意:如果需要列出较多数量的委托人,则考虑指定组,而不是指定用户。如果您指定的用户过多,则会引起性能问题。
清单 3-11 使用 web.xml 和 weblogic.xml 文件将安全角色和委托人映射到安全领域
web.xml entries:
<web-app>
...
<security-role>
<role-name>webuser</role-name>
</security-role>
...
</web-app>
<weblogic.xml entries:
<weblogic-web-app>
     <security-role-assignment>
<role-name>webuser</role-name>
<principal-name>myGroup</principal-name>
<principal-name>Bill</principal-name>
<principal-name>Mary</principal-name>
</security-role-assignment>
</weblogic-web-app>
清单 3-12 在 Web 应用程序部署描述符中使用 externally-defined 标记
web.xml entries:
<web-app>
...
<security-role>
<role-name>webuser</role-name>
</security-role>
...
</web-app>
<weblogic.xml entries:
<weblogic-web-app>
     <security-role-assignment>
<role-name>webuser</role-name>
<externally-defined/>
</security-role-assignment>

有关如何使用管理控制台配置 Web 应用程序安全的信息,请参阅使用角色和策略确保 WebLogic 资源安全

run-as-principal-name

run-as-principal-name 元素指定委托人的名称,以用于由配套文件 web.xml 中的 run-as 元素定义的安全角色。

使用位置

run-as-role-assignment 元素中使用 run-as-principal-name 元素。

示例

有关如何使用 run-as-principal-name 元素的示例,请参阅清单 3-13

run-as-role-assignment

run-as-role-assignment 元素将配套文件 web.xml 中的 role-name 元素定义的给定角色名映射到系统中的有效用户名。对于给定 Servlet,此值可由 Servlet 描述符中的 run-as-principal-name 元素替代。如果给定角色名缺少 run-as-role-assignment 元素,则 Web 应用程序容器会选择在 security-role-assignment 元素中定义的第一个委托人名称。

下表描述可在 run-as-role-assignment元素中定义的元素。

表 3-7 run-as-role-assignment 元素
元素
必需
可选
描述
<role-name>
必需
指定在配套文件 web.xml 中的 run-as 元素中定义的安全角色名。
<run-as-principal-name>
必需
指定在配套文件 web.xml 中的 run-as 元素中定义的安全角色名称的委托人。

 

示例:

清单 3-13 说明如何使用 run-as-role-assignment 元素让 SnoopServlet 始终作为用户 joe 执行。

清单 3-13 run-as-role-assignment 元素示例
web.xml:
  <servlet>
<servlet-name>SnoopServlet</servlet-name>
<servlet-class>extra.SnoopServlet</servlet-class>
<run-as>
<role-name>runasrole</role-name>
</run-as>
</servlet>
<security-role>
<role-name>runasrole</role-name>
</security-role>
weblogic.xml:
  <weblogic-web-app>
<run-as-role-assignment>
<role-name>runasrole</role-name>
<run-as-principal-name>joe</run-as-principal-name>
</run-as-role-assignment>
</weblogic-web-app>
security-permission

security-permission 元素指定与 J2EE 沙盒相关联的安全权限。

示例

有关如何使用 security-permission 元素的示例,请参阅清单 3-14

security-permission-spec

security-permission-spec 元素根据安全策略文件语法指定单个安全权限。有关 Sun 的安全权限规范的实现,请参阅以下 URL:

http://java.sun.com/j2se/1.5.0/docs/guide/security/PolicyFiles.html#FileSyntax

注意:放弃可选的 codebase 和 signedBy 子句。
使用位置

security-permission 元素中使用 security-permission-spec 元素。

示例

清单 3-14 说明如何使用 security-permission-spec 元素将权限授予 java.net.SocketPermission 类。

清单 3-14 security-permission-spec 元素示例
<weblogic-web-app>
<security-permission>
<description>Optional explanation goes here</description>
<security-permission-spec>
<!—
A single grant statement following the syntax of http://java.sun.com/j2se/1.5.0/docs/guide/security/PolicyFiles.html#FileSyntax, without the "codebase" and "signedBy" clauses, goes here. For example:
-->
grant {
permission java.net.SocketPermission "*", "resolve";
};
</security-permission-spec>
</security-permission>
</weblogic-web-app>

清单 3-14 中,权限 java.net.SocketPermission 是权限类名,“*”表示目标名称,resolve 表示操作(解析主机/IP 名称服务查找)。

security-role-assignment

security-role-assignment 元素声明一个安全角色和 WebLogic Server 安全领域中的一个或多个委托人 s 之间的映射。

注意:有关将 weblogic-application.xml 部署描述符中的 security-role-assignment 元素用于企业应用程序的信息,请参阅“使用 WebLogic Server 开发应用程序”中的企业应用程序部署描述符元素
示例

清单 3-15 说明如何使用 security-role-assignment 元素为委托人分配 PayrollAdmin 角色。

注意:如果需要列出较多数量的委托人,则考虑指定组,而不是指定用户。如果您指定的用户过多,则会引起性能问题。
清单  3-15 Security-role-assignment 元素示例
<weblogic-web-app>
<security-role-assignment>
<role-name>PayrollAdmin</role-name>
<principal-name>Tanya</principal-name>
<principal-name>Fred</principal-name>
<principal-name>system</principal-name>
</security-role-assignment>
</weblogic-web-app>

 


将编程安全用于 Web 应用程序

您可以在 Servlet 代码中编写 Servlet 以访问用户和安全角色。要执行此操作,请在 servlet 代码中使用下列方法:javax.servlet.http.HttpServletRequest.getUserPrincipaljavax.servlet.http.HttpServletRequest.isUserInRole(String role) 方法。

getUserPrincipal

使用 getUserPrincipal() 方法确定 Web 应用程序的当前用户。如果当前用户中存在一个 WLSUser Principal,此方法会将其返回。如果有多个 WLSUser Principals,则此方法返回由 Subject.getPrincipals().iterator()方法定义的排序中的第一个。如果没有WLSUser Principals,则 getUserPrincipal()方法返回第一个非 WLSGroup Principals。如果没有Principals,或者所有Principals的类型都是 WLSGroup,则此方法返回 null。此行为与 weblogic.security.SubjectUtils.getUserPrincipal() 方法的语义相同。

有关如何使用 getUserPrincipal() 方法的详细信息,请参阅 http://java.sun.com/j2ee/1.4/docs/tutorial/doc/Security4.html

isUserInRole

javax.servlet.http.HttpServletRequest.isUserInRole(String role) 方法返回一个布尔型值,指出是否通过身份验证的用户被授予了指定的逻辑安全“角色”。如果用户没有通过身份验证,该方法返回 false。

isUserInRole() 方法将安全角色映射到安全领域中的组名称。清单 3-16 给出的元素和 <servlet> 元素一起使用,以便在 web.xml 文件中定义安全角色。

清单 3-16 IsUserInRole web.xml 元素和 weblogic.xml 元素
Begin web.xml entries:
...
<servlet>
<security-role-ref>
<role-name>user-rolename</role-name>
<role-link>rolename-link</role-link>
</security-role-ref>
</servlet>
<security-role>
<role-name>rolename-link</role-name>
</security-role>
...
Begin weblogic.xml entries:
...
<security-role-assignment>
<role-name>rolename-link</role-name>
<principal-name>groupname</principal>
<principal-name>username</principal>
</security-role-assignment>
...

字符串 role 映射到在 <role-name> 元素中提供的名称,该元素嵌套在 web.xml 部署描述符中 <servlet>声明的 <security-role-ref> 元素内。<role-name> 元素用于在 Servlet 代码中定义安全角色或委托人(用户或组)的名称。<role-link> 元素映射到在 weblogic.xml 部署描述符中的 <security-role-assignment> 元素中定义的 <role-name>

注意:指定安全角色名称时,请遵循以下约定和限制:
  • 安全角色名称的正确语法与可扩展标记语言 (XML) 建议中对 Nmtoken 定义的语法(可从 Web 上获取,网址为 http://www.w3.org/TR/REC-xml#NT-Nmtoken)相同。
  • 不要使用空格、逗号、连字符或以下逗号分隔列表中的任何字符:/t、< >、#、|、&、~、?、( )、{ }。
  • 安全角色名区分大小写。
  • BEA 建议对安全角色名使用以下约定:它们应该独一无二。

例如,如果客户端已作为安全角色为 manager 的用户 Bill 成功登录,则以下方法将返回 true:

request.isUserInRole("manager")

清单 3-17 提供了一个示例。

清单 3-17 安全角色映射示例
Servlet code: 
out.println("Is the user a Manager? " +
                 request.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>bostonManagers</principal-name>
<principal-name>Bill</principal-name>
<principal-name>Ralph</principal-name>
</security-role-ref>

 


使用编程身份验证 API

有一些应用程序适合使用编程身份验证。

WebLogic Server 提供服务器端 API。该 API 支持从 Servlet 应用程序中进行编程身份验证:

weblogic.servlet.security.ServletAuthentication

通过使用该 API,可以编写 Servlet 代码来对用户执行身份验证、让用户登录,以及将用户与当前会话相关联,以便在默认(活动)安全领域中注册该用户。完成登录后,看上去就会像是用户使用标准机制登录一样。

您可以选择将 WebLogic 提供的两个类中的任意一个与 ServletAuthentication API 配合使用:weblogic.security.SimpleCallbackHandler 类或 weblogic.security.URLCallbackHandler 类。有关这些类的详细信息,请参阅 Javadocs for WebLogic Classes。

清单 3-18 显示了使用 SimpleCallbackHandler 的示例。清单 3-19 显示了使用 URLCallbackHandler 的示例。

清单 3-18 使用 SimpleCallbackHandler 类的编程身份验证代码片段
CallbackHandler handler = new SimpleCallbackHandler(username,
                                                               password);
Subject mySubject =
weblogic.security.services.Authentication.login(handler);
weblogic.servlet.security.ServletAuthentication.runAs(mySubject, request);
// 该处请求为 httpservletrequest 对象。
清单 3-19 使用 URLCallbackHandler 类的编程身份验证代码片段
CallbackHandler handler = new URLCallbackHandler(username,
                                                           password);
Subject mySubject =
weblogic.security.services.Authentication.login(handler);
weblogic.servlet.security.ServletAuthentication.runAs(mySubject, request);
// 该处请求httpservletrequest 对象。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值