在mule中使用groovy表达式实现有限的IP

在mule中使用groovy表达式实现有限的IP,groovy,filter,mule,Groovy,Filter,Mule,我在mule中使用cxf创建了一个代理服务。我的mule版本是3.3.0CE。现在,我想在使用代理服务创建的wsdl中设置一个限制。 我的限制不允许每个IP都看到我的wsdl。 为此,我找到了Groovy表达式和下面的代码: <expression-filter expression="#[groovy:'${allowed}'.contains(message.getInboundProperty('MULE_REMOTE_CLIENT_ADDRESS').substri

我在mule中使用cxf创建了一个代理服务。我的mule版本是3.3.0CE。现在,我想在使用代理服务创建的wsdl中设置一个限制。 我的限制不允许每个IP都看到我的wsdl。 为此,我找到了Groovy表达式和下面的代码:

<expression-filter
        expression="#[groovy:'${allowed}'.contains(message.getInboundProperty('MULE_REMOTE_CLIENT_ADDRESS').substring(message.getInboundProperty('MULE_REMOTE_CLIENT_ADDRESS').indexOf('/')+1, message.getInboundProperty('MULE_REMOTE_CLIENT_ADDRESS').indexOf(':')))]"
        doc:name="Expression" />

我不知道是好代码还是坏代码? 我不知道应该在哪里定义我的有效Ip?

这种方法是有效的。 我唯一的建议是将IP解析提取到一个全局函数中,以实现可重用性和更好的可读性:

<configuration>
    <expression-language>
        <global-functions>
            def parseIp(fullIp) {
                return fullIp.substring(fullIp.indexOf('/') + 1, fullIp.indexOf(':'))
            }
        </global-functions>
    </expression-language>
</configuration>    

def解析IP(完整IP){
返回fullIp.substring(fullIp.indexOf(“/”)+1,fullIp.indexOf(“:”)
}
然后您可以按如下方式使用它:

<expression-filter expression="#['${allowed}'.contains(parseIp(message.inboundProperties['MULE_REMOTE_CLIENT_ADDRESS']))]"
        doc:name="Expression" />

基于IP地址限制服务看起来不是一种可扩展的方法

如果有更多的客户机进入,或者甚至可能是一个客户机,可以从不同的环境(prod、test、dev)发送请求,那么您将拥有不同的IP

客户端也可以更改其机器,IP将不会保持不变。您不希望设计一个客户端的更改会影响您的系统,您的解决方案应该具有足够的可扩展性,以适应更多的客户端

一种解决方案是寻找
保护您的web服务
。这篇博文谈到了这一点


使用Mule搜索web服务安全性将提供更多结果

对于Mule EE用户,MuleSoft现在提供了一个企业安全模块,其中包括一个。

如果您致力于基于IP的过滤,这是最好的方法,但表达式最好用
.[]
包装。由于Mule 3有一个适当的兼容性模式,因此它可以不使用,但我强烈建议使用
#[]
来验证配置。感谢@DavidDossot和Seba的回复。现在我定义了一个名为“allowed”的全局字符串。我可以定义全局列表而不是字符串吗?因为我有使用wsdl的有效IP列表。上面的代码使用
contains
,所以如果
allowed
字符串包含多个IP,比如用comas分隔,它会工作的。非常感谢@DavidDossot。我如何以及在哪里设置
${allowed}
变量的值?谢谢@Learner,我使用Mule Spring安全管理器在我的web服务上输入用户名和密码。我无法启用WS-Security。