保护 Web 容器内的 JAX-RS 应用程序
您可以使用 Web 容器提供的安全服务来保护表示状态传输 (REST) 资源。 您可以配置安全性机制,其定义用户认证、传输安全、权限控制以及用户到角色的映射。
开始之前
为了相应定义安全性约束,重要的是,您熟悉应用程序及其展示的 RESTful 资源。此知识帮助您确定您应用程序所需的相应安全角色及其展示的单个资源。
为了说明如何保护 REST 应用程序,本主题使用称为 AddressBookApp 的样本 REST 应用程序。
您必须在应用程序服务器上完成应用程序的安装。例如,在您安装 AddressBookApp 应用程序之后,在 profile_root/config/cells/cellName/applications/applicationName.ear/deployments/applicationName_war/applicationName.war/WEB-INF 目录中找到的 AddressBookApp 部署描述符如以下示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_1255468655347">
<display-name>Sample REST Web Application</display-name>
<servlet>
<servlet-name>AddressBookApp</servlet-name>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.test.AddressBookApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AddressBookApp</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
在此示例中,servlet 映射指示在 /app_root_context/rest 目录(其中,app_root_context 是您在应用程序安装期间配置的)下提供 REST 资源。缺省根上下文是 /。您必须为 WebSphere Application Server 启用安全性。
关于此任务
您可以使用 Web 容器来应用认证以及将授权约束应用于在应用程序服务器环境中运行的 REST 应用程序。认证是需要最低安全性级别的业务 REST 资源的基本安全要求,可能需要基于调用者的身份进一步保护资源。
您可以为 REST 资源配置以下安全性机制:
- 要求用户使用 HTTP 基本认证或表单登录向应用程序进行认证。
- 配置应用程序以在调用 REST 资源时将 SSL 通道用于传输。
- 定义对 REST 资源模式的基于角色的授权约束。
- 实施注解的 SecurityContext 对象的编程使用以确定用户身份和角色。
过程
结果
在您定义安全性约束之后,对应用程序中定义的 REST 资源的访问只取决于用户认证是否成功。此外,您将角色约束应用于各种资源 URL 模式以启用对这些资源的基于角色访问。
示例
以下示例说明 AddressBookApp 样本应用程序的 web.xml 部署描述符,其中使用先前的过程步骤定义了安全性约束。
<web-app id="WebApp_1255468655347">
<display-name>Sample REST Web Application</display-name>
<servlet>
<servlet-name>AddressBookApp</servlet-name>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.test.AddressBookApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AddressBookApp</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<security-constraint id="SecurityConstraint_1">
<web-resource-collection id="WebResourceCollection_1">
<web-resource-name>AddressBookApp</web-resource-name>
<description>Protection area for Rest Servlet</description>
<url-pattern>/rest/addresses</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint id="AuthConstraint_1">
<description>Role1 for this rest servlet</description>
<role-name>Role1</role-name>
</auth-constraint>
<user-data-constraint id="UserDataConstraint_1">
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint id="SecurityConstraint_2">
<web-resource-collection id="WebResourceCollection_2">
<web-resource-name>AddressBookApp</web-resource-name>
<description>Protection area for Rest Servlet</description>
<url-pattern>/rest/addresses/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint id="AuthConstraint_2">
<description>Role2 for this rest servlet</description>
<role-name>Role2</role-name>
</auth-constraint>
<user-data-constraint id="UserDataConstraint_1">
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-role id="SecurityRole_1">
<description>This is Role1</description>
<role-name>Role1</role-name>
</security-role>
<security-role id="SecurityRole_2">
<description>This is Role2</description>
<role-name>Role2</role-name>
</security-role>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/logon.jsp</form-login-page>
<form-error-page>/logonError.jsp</form-error-page>
</form-login-config>
</login-config>
</web-app>
下一步做什么
使用管理控制台来管理 JAX-RS 应用程序的安全性。