下列主题描述了在 web.xml
和 weblogic.xm
l 文件中用于定义 Web 应用程序的安全要求的部署描述符元素:
web.xml 部署描述符
WebLogic Server 支持以下与 web.xml
安全相关的部署描述符元素:
auth-constraint
可选的 auth-constraint
元素定义哪些组或委托人有权访问在此安全约束中定义的 Web 资源集合。
下表描述可以在 auth-constraint
元素中定义的元素。
<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-10 说明如何使用 security-constraint
元素定义 web.xml
文件中的 SecureOrdersEast 资源安全。
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
元素包含安全角色的定义。该定义包含安全角色的可选描述和安全角色名称。
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
元素中定义的元素。
示例
有关如何在 web.xml
文件中使用 security-role-ref
元素的示例,请参阅清单 3-16。
user-data-constraint
user-data-constraint
元素定义应如何保护客户端和服务器之间的通信数据。
下表描述了可以在 user-data-constraint
元素中定义的元素。
使用位置
在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
元素中定义的元素。
| ||
使用位置
在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
创建委托人。
注意: | 如果需要列出较多数量的委托人,则考虑指定组,而不是指定用户。如果您指定的用户过多,则会引起性能问题。 |
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>
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-13 说明如何使用 run-as-role-assignment
元素让 SnoopServlet
始终作为用户 joe
执行。
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
类。
<weblogic-web-app>
A single grant statement following the syntax of
<security-permission>
<description>Optional explanation goes here</description>
<security-permission-spec>
<!—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
角色。
注意: | 如果需要列出较多数量的委托人,则考虑指定组,而不是指定用户。如果您指定的用户过多,则会引起性能问题。 |
<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.getUserPrincipal
和 javax.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
文件中定义安全角色。
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 提供了一个示例。
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
的示例。
CallbackHandler handler = new SimpleCallbackHandler(username,
password);
Subject mySubject =
weblogic.security.services.Authentication.login(handler);
weblogic.servlet.security.ServletAuthentication.runAs(mySubject, request);
// 该处请求为 httpservletrequest 对象。
CallbackHandler handler = new URLCallbackHandler(username,
password);
Subject mySubject =
weblogic.security.services.Authentication.login(handler);
weblogic.servlet.security.ServletAuthentication.runAs(mySubject, request);
// 该处请求
为httpservletrequest
对象。