我正在学习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.SUCCESS
(null
是而不是选项),它都必须在返回之前将调用者的身份传达给(Servlet)运行时,而不管调用者实际上已经过身份验证或是匿名的。这可以通过经由运行时提供的CallbackHandler
处理CallerPrincipalCallback
和/或至少单个GroupPrincipalCallback
(可以将组分配给匿名调用者)来实现。用null Principal
(name)参数构造这些回调中的任何一个都会向运行时发出信号,表明调用者将被视为匿名的,或者没有组将与之关联。同样,请注意,兼容的运行时不会默认假设调用者是匿名的;必须明确告知,否则结果是不确定的。
SUCCESS
的语义是,请求应被允许传播到(基于Servlet的)服务端点,iff基于组(角色)的调用方授权成功。然而,为了进行授权,必须让运行时知道调用者的身份,这就是为什么前面提到的回调是必要的。
AuthStatus
值与HTTP响应状态代码
两者之间的关系可能有点令人困惑。前者是与协议无关的,本质上是消息处理模型中的状态转换标签。理论上,它们约束了后者;在实践中,由于多个组件和应用程序服务器本身可能会更改响应的状态,因此建议您在非AuthStatus.SUCCESS
/AuthStatus.SEND_SUCCESS
validateRequest
/secureResponse
返回情况下自行分配它。