Web Service 安全性授权模型

以 Servlet 或 Enterprise JavaBeans (EJB) 形式实现的提供者应用程序可以使用 Web Service 并且受 Web Service 安全性保护。 Java Platform, Enterprise Edition (Java EE) 基于角色的授权可用于控制对以 Servlet 或 EJB 形式实现的 Web Service 提供者应用程序的访问。 虽然使用相同方式为 Servlet 和 EJB 实现配置了安全角色,但是对服务的访问因实现的不同而不同。

对于以 Servlet 形式实现的提供程序,Web 容器通过 HTTP 基本认证来执行基于角色的授权。
  1. 安全性令牌在 SOAP 请求的 HTTP 头中进行传递。
  2. Web 容器对安全性令牌进行认证,然后对用户执行基于角色的授权。
  3. 用户授权成功之后,Web 容器将使用入站消息调用 Web Service 引擎。

下图说明了基于角色的授权过程的每一个步骤针对 Servlet 发生的位置。

图 1。 Web Service 安全性中的 Servlet 授权此图显示了 Servlet 实现的基于角色的授权过程。
Web Service 安全性中的 servlet 授权
对于以 EJB 形式实现的提供程序,EJB 容器执行基于角色的授权。
  1. 用户标识的安全性令牌在 SOAP 请求的安全性头中进行传递。
  2. Web Service 安全性对该令牌进行认证。
  3. 通过调用者配置,Web Service 安全性设置当前线程上的已认证令牌的标识。
  4. 当 Web Service 引擎调用端点时,EJB 容器对当前线程上的标识执行基于角色的授权。

下图说明了基于角色的授权过程的每一个步骤针对 EJB 发生的位置。

图 2。 Web Service 安全性中的 EJB 授权此图显示了 EJB 实现的基于角色的授权过程。
Web Service 安全性中的 EJB 授权

当 Web Service 提供程序以 Servlet 形式实现时,Web Service 安全性在 SOAP 请求的安全性头中传递的令牌不能用于基于角色的授权以访问服务。

当 Web Service 提供程序以 EJB 形式实现时,如果活动 Web Service 安全性约束中有该令牌的调用者配置,那么 Web Service 安全性在 SOAP 请求的安全性头中传递的令牌只能用于基于角色的授权以供 EJB 容器访问服务。

以 EJB 形式实现的 Web Service 提供程序还可以使用 Web 容器来执行基于角色的授权。 为此,图中所示的路由器 servlet 通过 HTTP Basic Authentication 对 Web 服务安全中的 EJB 授权进行了保护。 完成此操作后,进程将继续执行,如图 Web Service 安全性中的 Servlet 授权中所示。

当活动 Web Service 安全性约束中有入站令牌的调用者配置时,会在当前线程上的安全上下文中将该令牌设置为 runAs 标识。 受保护的提供者应用程序本身可以根据该标识来制定权限决策。 这同时适用于 Servlet 和 EJB。

提示: 虽然 WS-Security 令牌使用者无法对 servlet 执行基于角色的授权,但您可以创建定制登录模块,以针对用户注册表中的特定组验证入站用户。 有关如何在 UsernameToken, 上实现这一功能的示例,请阅读 " 使用堆叠 JAAS 登录模块替换 UsernameToken 消费者的身份验证方法 "。