如何控制 Mule Cache 中的密钥生成
How to control key generation in Mule Cache
我的要求是将用户(使用外部 ws)作为我的 Mule Flow 的一部分进行身份验证,并在缓存中使用身份验证的结果。但是,如果用户凭据更改,则缓存应该自动失效,并且必须使用外部 ws 完成用户身份验证。基本上缓存键应该基于用户凭证。这可能吗 ?
这是我的 mule 流程,我看到 Mule 在第一个请求之后缓存结果,而不管后续请求中的有效负载是否发生变化(这是发送凭据的地方)mule 总是 returns来自缓存的结果。因此,当第一个请求的凭据不正确时,用户身份验证失败并且 mule 缓存响应。从这一点开始,无论在后续请求中发送正确的凭据,它总是指缓存和 returns 用户身份验证失败。我如何实现我想要实现的目标?
这是我的 mule 流程:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.6.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd">
<http:listener-config name="HTTP-Inbound-Endpoint" host="0.0.0.0" port="8888" doc:name="HTTP Listener Configuration"/>
<http:request-config name="HTTP_Request_Configuration" host="10.10.10.10" port="8080" doc:name="HTTP Request Configuration"/>
<ee:object-store-caching-strategy name="Auth-Cache-Strategy" doc:name="Caching Strategy">
<in-memory-store name="UserAuthCache" maxEntries="100" entryTTL="3600" expirationInterval="3600"/>
</ee:object-store-caching-strategy>
<flow name="cacheauthenticationFlow">
<http:listener config-ref="HTTP-Inbound-Endpoint" path="*" doc:name="HTTP"/>
<object-to-string-transformer doc:name="Object to String"/>
<ee:cache cachingStrategy-ref="Auth-Cache-Strategy" doc:name="Cache">
<logger message="Incoming: #[message.payload]" level="INFO" doc:name="Logger"/>
<scripting:transformer doc:name="Python">
<scripting:script engine="jython"><![CDATA[import base64
authorization = message.getInboundProperty("authorization")
#print "Authorization is: \"" + authorization + "\""
authstring = authorization.split()
#print authstring
credentials = authstring[-1]
#print "Credentials => " + credentials
decodedAuth = credentials.decode('base64')
#print decodedAuth
if (decodedAuth.find("@") > 0):
(id, password) = decodedAuth.split(":")
(username, project) = id.split("@")
print username + ":" + password + ", Project: " + project
else:
(username, password) = decodedAuth.split(":")
print username + ":" + password
message.payload = { "username" : username + "@" + project , "password" : password }
result = message]]></scripting:script>
</scripting:transformer>
<json:object-to-json-transformer doc:name="Object to JSON"/>
<logger message="Incoming payload: #[message.payload]" level="INFO" doc:name="Logger"/>
<http:request config-ref="HTTP_Request_Configuration" path="/wservices/authenticate/user" method="POST" doc:name="HTTP-Dev-Box-Authentication"/>
<object-to-string-transformer doc:name="Object to String"/>
</ee:cache>
<logger message="Response From Cache: #[message.payload]" level="INFO" doc:name="Logger"/>
<set-payload value="#[message.payload.'status']" doc:name="Response"/>
</flow>
</mule>
由于缓存范围的默认密钥生成策略是基于消息有效负载的,因此在您的特定情况下,一个选项是简单地将 scripting:transformer
移动到 ee:cache
范围之前执行。
对于更通用的解决方案,您不想覆盖您的请求负载,您可以在 ee:cache
元素上定义 keyGenerationExpression
或 keyGenerator-ref
属性来控制我生成的缓存密钥。
例如,要使用完整的 HTTP 授权 header 作为密钥,您可以使用:
<ee:cache cachingStrategy-ref="Auth-Cache-Strategy" doc:name="Cache"
keyGenerationExpression="#[message.inboundProperties.authorization]">
<!-- Your flow here -->
</ee:cache>
有关详细信息,请参阅 cache scope documentation。
如果您想使用这种方法,您可以将部分 jython 代码移到缓存范围之外,更改它,以便将用户和密码设置为消息中的单独流变量,然后在keyGenerationExpression
然后稍后在一个简单的 set-payload
转换器中缓存范围内。
你可以定义一个全局配置"Caching_Strategy":
<ee:object-store-caching-strategy name="Caching_Strategy" keyGenerationExpression="#[flowVars.userID]" doc:name="Caching Strategy"/>
并参考缓存流中的全局配置:
<ee:cache doc:name="Cache" cachingStrategy-ref="Caching_Strategy">
<!-- flow -->
</ee:cache>
您可以通过流变量控制您的 keyGenerationExpression #[flowVars.userID]
有关示例的完整详细信息,请参阅
http://www.tutorialsatoz.com/caching-in-mule-cache-scope/
我的要求是将用户(使用外部 ws)作为我的 Mule Flow 的一部分进行身份验证,并在缓存中使用身份验证的结果。但是,如果用户凭据更改,则缓存应该自动失效,并且必须使用外部 ws 完成用户身份验证。基本上缓存键应该基于用户凭证。这可能吗 ?
这是我的 mule 流程,我看到 Mule 在第一个请求之后缓存结果,而不管后续请求中的有效负载是否发生变化(这是发送凭据的地方)mule 总是 returns来自缓存的结果。因此,当第一个请求的凭据不正确时,用户身份验证失败并且 mule 缓存响应。从这一点开始,无论在后续请求中发送正确的凭据,它总是指缓存和 returns 用户身份验证失败。我如何实现我想要实现的目标?
这是我的 mule 流程:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.6.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd">
<http:listener-config name="HTTP-Inbound-Endpoint" host="0.0.0.0" port="8888" doc:name="HTTP Listener Configuration"/>
<http:request-config name="HTTP_Request_Configuration" host="10.10.10.10" port="8080" doc:name="HTTP Request Configuration"/>
<ee:object-store-caching-strategy name="Auth-Cache-Strategy" doc:name="Caching Strategy">
<in-memory-store name="UserAuthCache" maxEntries="100" entryTTL="3600" expirationInterval="3600"/>
</ee:object-store-caching-strategy>
<flow name="cacheauthenticationFlow">
<http:listener config-ref="HTTP-Inbound-Endpoint" path="*" doc:name="HTTP"/>
<object-to-string-transformer doc:name="Object to String"/>
<ee:cache cachingStrategy-ref="Auth-Cache-Strategy" doc:name="Cache">
<logger message="Incoming: #[message.payload]" level="INFO" doc:name="Logger"/>
<scripting:transformer doc:name="Python">
<scripting:script engine="jython"><![CDATA[import base64
authorization = message.getInboundProperty("authorization")
#print "Authorization is: \"" + authorization + "\""
authstring = authorization.split()
#print authstring
credentials = authstring[-1]
#print "Credentials => " + credentials
decodedAuth = credentials.decode('base64')
#print decodedAuth
if (decodedAuth.find("@") > 0):
(id, password) = decodedAuth.split(":")
(username, project) = id.split("@")
print username + ":" + password + ", Project: " + project
else:
(username, password) = decodedAuth.split(":")
print username + ":" + password
message.payload = { "username" : username + "@" + project , "password" : password }
result = message]]></scripting:script>
</scripting:transformer>
<json:object-to-json-transformer doc:name="Object to JSON"/>
<logger message="Incoming payload: #[message.payload]" level="INFO" doc:name="Logger"/>
<http:request config-ref="HTTP_Request_Configuration" path="/wservices/authenticate/user" method="POST" doc:name="HTTP-Dev-Box-Authentication"/>
<object-to-string-transformer doc:name="Object to String"/>
</ee:cache>
<logger message="Response From Cache: #[message.payload]" level="INFO" doc:name="Logger"/>
<set-payload value="#[message.payload.'status']" doc:name="Response"/>
</flow>
</mule>
由于缓存范围的默认密钥生成策略是基于消息有效负载的,因此在您的特定情况下,一个选项是简单地将 scripting:transformer
移动到 ee:cache
范围之前执行。
对于更通用的解决方案,您不想覆盖您的请求负载,您可以在 ee:cache
元素上定义 keyGenerationExpression
或 keyGenerator-ref
属性来控制我生成的缓存密钥。
例如,要使用完整的 HTTP 授权 header 作为密钥,您可以使用:
<ee:cache cachingStrategy-ref="Auth-Cache-Strategy" doc:name="Cache"
keyGenerationExpression="#[message.inboundProperties.authorization]">
<!-- Your flow here -->
</ee:cache>
有关详细信息,请参阅 cache scope documentation。
如果您想使用这种方法,您可以将部分 jython 代码移到缓存范围之外,更改它,以便将用户和密码设置为消息中的单独流变量,然后在keyGenerationExpression
然后稍后在一个简单的 set-payload
转换器中缓存范围内。
你可以定义一个全局配置"Caching_Strategy":
<ee:object-store-caching-strategy name="Caching_Strategy" keyGenerationExpression="#[flowVars.userID]" doc:name="Caching Strategy"/>
并参考缓存流中的全局配置:
<ee:cache doc:name="Cache" cachingStrategy-ref="Caching_Strategy">
<!-- flow -->
</ee:cache>
您可以通过流变量控制您的 keyGenerationExpression #[flowVars.userID]
有关示例的完整详细信息,请参阅 http://www.tutorialsatoz.com/caching-in-mule-cache-scope/