3

我正在研究 JASPIC,我从头开始了一个小项目来探索它以及它在 Wildfly 上的表现。第一步是调用我的 SAMvalidateRequest方法并返回未受保护资源的内容,即index.html页面。好的,validateRequest被调用。我检查MessageInfo javax.security.auth.message.MessagePolicy.isMandatory属性是否设置为false. 困难时期来了。在我的第一次尝试中,如果属性设置为 falsevalidateRequest返回AUTH_SUCCESS值,但浏览器返回403错误。在我的第二次尝试validateRequest返回时null,浏览器返回 a200但响应中没有数据(与 无关index.html)。我应该怎么做才能正确处理 servlet 请求?你可以在这里找到源代码。谢谢。

4

1 回答 1

3

我应该怎么做才能正确处理 servlet 请求?

理解并遵守规范的相关章节。对于典型的面向 Servlet ServerAuthModule(SAM),它们是:

  • validateRequest§ 1.2.5 和 § 2.1.5.2 提供的服务器端消息处理模型的一般概述(第 2 点是被调用的地方)。后者以及第 25 页(PDF 中的第 39 页)上的模型状态图特别重要。
  • HTTP Servlet Container Profile 对上述内容的专门化,可在 § 3.8.3.2、§ 3.8.4 和 § 3.9 中找到。

当然,由于您也实现了工厂,因此您应该了解很多不同意义的额外细节,因此您可能很难避免完整阅读前三章。

SUCCESS从返回validateRequest

每当您的 SAM 的实现validateRequest返回AuthStatus.SUCCESSnull不是一个选项)时,它必须在返回之前将调用者的身份传达给(Servlet)运行时,而不管调用者实际上已经过身份验证还是匿名。这可以通过运行时提供的 .和/或至少一个(可以将组分配给匿名调用者)来完成。用 a 构造这些回调中的任何一个CallerPrincipalCallbackGroupPrincipalCallbackCallbackHandlernull Principal(name) 参数分别向运行时发出信号,表明调用者将被视为匿名,或者没有组与其相关联。再次注意,兼容的运行时不会默认调用者是匿名的;必须明确告知,否则结果是不确定的。

的语义是,如果基于组(角色)的调用方授权成功SUCCESS,则应允许请求传播到(基于 Servlet 的)服务端点。然而,为了进行授权,必须让运行时知道调用者的身份,这就是为什么上述回调是必要的。

AuthStatus值与 HTTP 响应状态代码

两者之间的关系可能有点令人困惑。前者是协议中立的,本质上是消息处理模型中的状态转换标签。从理论上讲,它们限制了后者;在实践中,由于多个组件和应用程序服务器本身可能会改变响应的状态,因此建议您在非//返回的情况下自己AuthStatus.SUCCESS分配它AuthStatus.SEND_SUCCESS validateRequestsecureResponse

于 2016-07-27T10:19:30.870 回答