【发布时间】:2011-06-28 17:51:23
【问题描述】:
我们有一个通过 Apache Tomcat 交付的 REST API,Flash Web 应用程序旨在与之通信。
身份验证是通过 SSL 上的基本身份验证执行的(尽管基本身份验证中的密码是 SHA-2 的)。问题在于,对 Flash 客户端使用基本身份验证会导致标准浏览器登录框出现,因为标题中有“WWW-Authentication: Basic”。 Flash 无法通过在请求之前手动设置 Authorization 标头来绕过此问题。
其他客户端需要能够通过现有机制进行身份验证,因此重写身份验证逻辑并不理想。
我的想法是,可以动态重写发送到 Flash 客户端和从 Flash 客户端接收的授权标头,以使用另一个名称作为基本身份验证,这将导致浏览器无法理解身份验证机制并且不显示对话框。可以将进出 Tomcat 的身份验证标头从“WWW-Authenticate: Basic”重写为“WWW-Authenticate: PretendBasic”,但理想情况下,内置容器安全性仍然可以在重写后处理基本身份验证。
我编写了一个过滤器,将入站标头重写为“WWW-Authenticate: PretendBasic”为“WWW-Authenticate: Basic”,希望下一个过滤器链是 auth 并且请求将被正常处理。不幸的是,Servlet 规范声明不能在身份验证之前插入过滤器。我认为这项工作的唯一可能性是创建一个可堆叠的 JAAS 身份验证模块,如果来自 Flash 客户端,它将首先对请求执行标头重写,然后将身份验证传递给现有的容器管理的安全系统。
由于我不熟悉 JAAS,我希望社区能够阐明如何实现这一点,以及这是否是一个好主意。
【问题讨论】:
标签: java flash http tomcat jax-rs