Jaspic:处理对未受保护资源的访问
Jaspic: handle access to unprotected resource
我正在研究 JASPIC,我从头开始一个小项目来探索它以及它在 Wildfly 上的表现。第一步是调用我的 SAM validateRequest
方法和未受保护资源的 return 内容,即 index.html
页面。好的,validateRequest
被调用了。我检查 MessageInfo
javax.security.auth.message.MessagePolicy.isMandatory
属性 是否设置为 false
。困难时期来了。在我的第一次尝试中,如果 属性 设置为 false validateRequest
returns AUTH_SUCCESS
值,但浏览器返回 403
错误。在我第二次尝试 validateRequest
returns null
时,浏览器返回 200
但响应中没有数据(与 index.html
无关)。我应该怎么做才能正确处理 servlet 请求?
你可以找到来源here。谢谢。
What should I do to handle servlet requests correctly?
了解并遵守 specification 的相关部分。对于典型的面向 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
实现是 return AuthStatus.SUCCESS
(null
不是 一个选项),它 必须 在 returning 之前将调用者的身份传达给 (Servlet) 运行时,无论调用者实际上已经过身份验证还是匿名。这可以通过运行时提供的 CallbackHandler
处理 CallerPrincipalCallback
、and/or 至少一个 GroupPrincipalCallback
(可以将组分配给匿名调用者)来实现.使用 null Principal
(name) 参数构造这些回调中的任何一个都会向运行时发出信号,表明调用者将被视为匿名,或者没有任何组与之关联。再次注意,兼容的运行时不会默认假设调用者是匿名的;必须明确告知,否则结果不确定。
SUCCESS
的语义是允许请求传播到(基于 Servlet 的)服务端点,iff 基于组(角色)来电授权成功。然而,为了进行授权,运行时必须知道调用者的身份,这就是为什么需要上述回调的原因。
AuthStatus
值与 HTTP 响应状态代码
两者之间的关系可能有点令人困惑。前者是协议中立的,并且本质上是消息处理模型中的状态转换标签。理论上他们限制了后者;实际上,由于多个组件和应用程序服务器本身可能会改变响应的状态,因此建议您自己在非 AuthStatus.SUCCESS
/AuthStatus.SEND_SUCCESS
validateRequest
/secureResponse
中分配它return 例。
我正在研究 JASPIC,我从头开始一个小项目来探索它以及它在 Wildfly 上的表现。第一步是调用我的 SAM validateRequest
方法和未受保护资源的 return 内容,即 index.html
页面。好的,validateRequest
被调用了。我检查 MessageInfo
javax.security.auth.message.MessagePolicy.isMandatory
属性 是否设置为 false
。困难时期来了。在我的第一次尝试中,如果 属性 设置为 false validateRequest
returns AUTH_SUCCESS
值,但浏览器返回 403
错误。在我第二次尝试 validateRequest
returns null
时,浏览器返回 200
但响应中没有数据(与 index.html
无关)。我应该怎么做才能正确处理 servlet 请求?
你可以找到来源here。谢谢。
What should I do to handle servlet requests correctly?
了解并遵守 specification 的相关部分。对于典型的面向 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
实现是 return AuthStatus.SUCCESS
(null
不是 一个选项),它 必须 在 returning 之前将调用者的身份传达给 (Servlet) 运行时,无论调用者实际上已经过身份验证还是匿名。这可以通过运行时提供的 CallbackHandler
处理 CallerPrincipalCallback
、and/or 至少一个 GroupPrincipalCallback
(可以将组分配给匿名调用者)来实现.使用 null Principal
(name) 参数构造这些回调中的任何一个都会向运行时发出信号,表明调用者将被视为匿名,或者没有任何组与之关联。再次注意,兼容的运行时不会默认假设调用者是匿名的;必须明确告知,否则结果不确定。
SUCCESS
的语义是允许请求传播到(基于 Servlet 的)服务端点,iff 基于组(角色)来电授权成功。然而,为了进行授权,运行时必须知道调用者的身份,这就是为什么需要上述回调的原因。
AuthStatus
值与 HTTP 响应状态代码
两者之间的关系可能有点令人困惑。前者是协议中立的,并且本质上是消息处理模型中的状态转换标签。理论上他们限制了后者;实际上,由于多个组件和应用程序服务器本身可能会改变响应的状态,因此建议您自己在非 AuthStatus.SUCCESS
/AuthStatus.SEND_SUCCESS
validateRequest
/secureResponse
中分配它return 例。