问题描述
我在具有JWT安全性的spring网关后面有一个嵌入式orbeon实例。对于orbeon生成器来说,这很好用,我需要转发Authorization标头以使事情正常运行。 但是对于表单运行者,我现在有一个要求:对于某些表单,需要身份验证,而对于另一些表单,则不需要身份验证。 可以通过以下方式配置Orbeon:如果存在Authorization标头,则将其转发;如果不存在,则不执行任何操作(只需加载表单并使其填写)?
这是我的properties-local-prod.xml中用于标头转发的设置
<property
as="xs:string"
name="oxf.http.forward-headers"
value="Authorization"/>
<property
as="xs:string"
name="oxf.xforms.forward-submission-headers"
value="Authorization token allowDraft"/>
<property
as="xs:string"
name="oxf.fr.authentication.method"
value="header"/>
当我尝试不经身份验证就打开嵌入式from-runner时得到了401(显然没有任何东西可以发送到orbeon)。我在orbeon日志中找到了它:
HTTP status code 401 {controller: "oxf:/apps/fr/page-flow.xml",method: "GET",path:
"/fr/app/form/edit/myforminstanceid",status-code: "401"}
一个可能的解决方案是,是否有可能定义一种可以在每个表单定义基础上应用的运行上下文,例如prod-auth,prod-public(不幸的是,由于我们只有一个Orbeon,它们应该并行激活)实例)。 (再考虑已经可用的run modes,例如,对于同一组表单,我应该能够定义该保存草稿对于有经验的用户可见,但对于匿名用户不可见...尽管我已经解决了加上一些不太好的JavaScript魔术。)
解决方法
当将类似的配置放置到properties-prod.xml
时,Orbeon本身不会执行任何操作,只是转发给定的标头。
尽管默认的Orbeon Forms日志记录可能更好(关于进一步的HTTP调用以了解后台发生了什么),但日志中只有一行是在请求到达时它执行的操作。事实证明,我的自定义后端(持久层)期望使用Authorization
标头。
我不得不在我的春季安全配置中添加一个(/contextRoot/orbeon).permitAll()
,它开始起作用。