jakarta-ee-Jaspic:处理对未受保护资源的访问



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

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

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

  • 服务器端消息处理模型的一般概述(第2点是调用validateRequest的地方),由§1.2.5和§2.1.5.2提供。后者以及第25页(PDF中的第39页)上的模型状态图尤为重要
  • HTTP Servlet容器配置文件对上述内容的专门化,见§3.8.3.2、§3.8.4和§3.9

当然,由于你也实现了工厂,所以你应该注意一些不同意义的额外细节,因此你可能更难避免完整阅读前三章。

validateRequest返回SUCCESS

无论何时SAM的validateRequest实现要返回AuthStatus.SUCCESSnull而不是选项),它都必须在返回之前将调用者的身份传达给(Servlet)运行时,而不管调用者实际上已经过身份验证或是匿名的。这可以通过经由运行时提供的CallbackHandler处理CallerPrincipalCallback和/或至少单个GroupPrincipalCallback(可以将组分配给匿名调用者)来实现。用null Principal(name)参数构造这些回调中的任何一个都会向运行时发出信号,表明调用者将被视为匿名的,或者没有组将与之关联。同样,请注意,兼容的运行时不会默认假设调用者是匿名的;必须明确告知,否则结果是不确定的。

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

AuthStatus值与HTTP响应状态代码

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

最新更新