我正在学习JASPIC,我从头开始一个小项目来探索它以及它在Wildfly上的表现。第一步是调用我的SAM validateRequest
方法并返回未受保护资源的内容index.html
页面。好的,调用了validateRequest
。我检查MessageInfo
javax.security.auth.message.MessagePolicy.isMandatory
属性是否设置为false
。困难时期到来了。在我的第一次尝试中,如果property设置为false validateRequest
返回AUTH_SUCCESS
值,但浏览器会返回403
错误。在我的第二次尝试validateRequest
返回null
时,浏览器返回200
,但响应中没有数据(没有关于index.html
)。我该怎么做才能正确处理servlet请求?
您可以找到来源here。感谢。
答案 0 :(得分:3)
我该怎么做才能正确处理servlet请求?
理解并遵守specification的相关部分。对于典型的面向Servlet的ServerAuthModule
(SAM),它们是:
validateRequest
被调用的地方),由第1.2.5节和第2.1.5.2节提供。后面的版本以及第25页的模型状态图(PDF中的第39页)特别重要。当然,既然您也实施了工厂,那么您应该注意的是一些具有不同意义的其他细节,因此您可能更难以避免阅读前三章中的内容。他们的全部。
从SUCCESS
validateRequest
每当您的SAM的validateRequest
实施要返回AuthStatus.SUCCESS
(null
不选项)时,必须无论调用者实际已经过身份验证还是匿名调用,都会在返回之前将调用者的身份传递给(Servlet)运行时。这可以通过运行时提供的CallerPrincipalCallback
处理GroupPrincipalCallback
和/或至少一个CallbackHandler
(可以将组分配给匿名调用者)来实现。使用null Principal
(name)参数构造这些回调中的任何一个都会向运行时发出信号,表示调用者将被视为匿名,或者没有任何组与之关联。再次注意,默认的调用者默认假设是由兼容的运行时做出的;必须明确告知,否则结果不明确。
SUCCESS
的语义是允许请求传播到(基于Servlet的)服务端点, iff 基于组(基于角色)的调用者授权成功。但是,为了进行授权,必须使运行时知道调用者的身份,这就是上述回调是必要的原因。
AuthStatus
值与HTTP响应状态代码
两者之间的关系可能有点令人困惑。前者是协议中立的,基本上是消息处理模型中的状态转换标签。理论上他们限制了后者;实际上,由于多个组件和应用程序服务器本身可能会改变响应的状态,因此建议您自己在非AuthStatus.SUCCESS
/ AuthStatus.SEND_SUCCESS
validateRequest
/ secureResponse
中进行分配。返回案件。