要求是根据端点/资源限制 clientId。我参考了 Mule4 的这篇文章
文章演示了如何从标头中获取
clientId
,即 attributes.headers['client_id']
,正如在我的请求中,我们将 clientId 作为基本身份验证中 userName
的一部分传递。理想情况下需要提取 userName
。实际上,当它执行时,值会以 Base64 编码形式传递。我知道如何使用 dwl 提取
%dw 2.0
output application/java
import * from dw::core::Strings
import * from dw::core::Binaries
---
substringBefore(fromBase64(substringAfter(attributes.headers.authorization default "","Basic ")),":")
我正在尝试适应自定义策略来提取用户名进行验证,就像上面在 dwl 中提到的那样。没有取得任何成功。
还参考了Mulesoft的这篇文章,它说明了如何从header、payload、quaryParam中提取客户端Id,当涉及到
Obtaining Credentials using Basic Authorization header
时,它跳过了表达式字段。
https://docs.mulesoft.com/api-manager/2.x/client-id-based-policies
如何通过Mule自定义策略方式从Basic Auth中提取用户名?
任何想法将不胜感激。谢谢
如果我的问题不清楚,请告诉他们。 使用Mule4.4。
编辑以提供更多详细信息:
参考如下政策
<http-policy:proxy name="{{{policyId}}}-custom-policy">
<http-policy:source>
<try>
<choice >
{{#clientIDs}}
<when expression="#['{{{.}}}'=={{{clientIdExpression}}}]">
<logger level="INFO" message="Route Found"/>
</when>
其中
{{{clientIdExpression}}}
是从 YAML 值中选取的 attributes.headers['client_id']
所以我用 dwl 表达式替换了上面的选择表达式
#['{{{.}}}'=={{{clientIdExpression}}}]
,以从 auth 获取用户名并进行比较
<http-policy:proxy name="{{{policyId}}}-custom-policy">
<http-policy:source>
<try>
<choice >
{{#clientIDs}}
<when expression="#[%dw 2.0
output application/java
import * from dw::core::Strings
import * from dw::core::Binaries
var extractClientID = substringBefore
(fromBase64(substringAfter(attributes.headers.authorization default "","Basic ")),":")
---
if ('{{{.}}}' == extractClientID) true else false ">
<logger level="INFO" message="Route Found"/>
</when>
它给我加载错误
c:/... Element type "when" must be followed by either attribute specifications, ">" or "/>". at org.mule.runtime.core.api.config.builders.AbstractConfigurationBuilder.configure(AbstractConfigurationBuilder.java:56) at org.mule.runtime.core.api.config.builders.AbstractResourceConfigurationBuilder.configure(AbstractResourceConfigurationBuilder.java:84)
您知道如何在自定义策略中使用 dataweave 吗?注释开始和结束标记的含义? 任何帮助将不胜感激。
您的when表达式字符串中有一个拼写错误。
表达式字符串有一个需要关闭的方括号 -