在身份验证之前重写入站Java服务器授权标头

时间:2011-02-16 23:13:21

标签: java flash http tomcat jax-rs

我们有一个通过Apache Tomcat提供的REST API,Flash Web应用程序旨在与之通信。

使用基本身份验证通过SSL执行身份验证(尽管基本身份验证中的密码是SHA-2)。问题是,对Flash客户端使用基本身份验证会导致标准浏览器登录框出现,因为标题中包含“WWW-Authentication:Basic”。 Flash无法通过在请求之前手动设置Authorization标头来绕过此功能。

其他客户端需要能够通过现有机制进行身份验证,因此重写身份验证逻辑并不理想。

我认为发送到Flash客户端和从Flash客户端接收的授权头可以动态地重写为使用Basic auth的另一个名称,这会导致浏览器不理解auth机制而不显示对话框。来自Tomcat的身份验证标头可以从“WWW-Authenticate:Basic”重写为“WWW-Authenticate:PretendBasic”,但理想情况下,内置容器安全性仍然可以在重写后处理基本身份验证。

我写了一个过滤器来重写入站标题为“WWW-Authenticate:PretendBasic”为“WWW-Authenticate:Basic”,希望下一个过滤器链是auth,并且请求将正常处理。不幸的是,Servlet规范规定在验证之前不能插入过滤器。我认为这种工作的唯一可能性是创建一个可堆叠的JAAS身份验证模块,该模块首先对来自Flash客户端的请求执行头重写,然后将身份验证传递给现有的容器管理安全系统。

由于我不熟悉JAAS,我希望社区能够阐明如何实现这一目标,以及首先是否是一个好主意。

2 个答案:

答案 0 :(得分:0)

如果您的Flash应用程序始终与使用basic保护的服务器一起使用,则它可以在生成对Web服务的第一个请求之前请求凭据。因此,第一个请求将包含身份验证标头,您将无法收到401响应。

答案 1 :(得分:0)

我原本以为通过WWW-Authenticate启用身份验证,作为模仿HTTP Basic,可以解决问题。

当前您正在使用HTTP基本身份验证,只需添加另一个执行HTTP Basic但不依赖于WWW-Authenticate标头而不是Authorization标头的身份验证器。

然后,您可以在Flash中包含标头,并忽略该客户端中的HTTP Basic。

我在Jetty上使用3种不同的身份验证方案做了类似的事情。我不确定Tomcat的方式是什么。