使用拦截URL的Mule HTTP基本身份验证

时间:2015-11-04 17:44:14

标签: spring authentication mule

我想为我的mule应用程序实现HTTP基本身份验证,该应用程序侦听HTTP并且URI为http://localhost:8082/api/customers。让我们假设只支持POST和GET。

我尝试以

的方式实现身份验证
  • 如果用户具有 ROLE_ADMIN 角色,则可以访问POST和GET端点
  • 如果用户只有 ROLE_USER 角色,则只能访问GET端点

我想利用Spring身份验证管理器实现此目的。我将身份验证配置如下:

首先我创建了身份验证管理器

<ss:authentication-manager xmlns:ss="http://www.springframework.org/schema/security" alias="authenticationManager">
    <ss:authentication-provider>
        <ss:user-service id="userService">
            <ss:user name="user" password="user" authorities="ROLE_USER" />
            <ss:user name="admin" password="admin" authorities="ROLE_ADMIN" />
        </ss:user-service>
    </ss:authentication-provider>
</ss:authentication-manager>

然后我想拦截网址

<ss:http auto-config="true" realm="mule-realm" use-expressions="true">
    <ss:intercept-url pattern="/api/customers" method="GET"  access="ROLE_USER"/>
    <ss:intercept-url pattern="/api/customers" method="POST" access="ROLE_ADMIN"/>
</ss:http>

最后,我将basic-security-filter置于HTTP Listener之后,如下所示

<http:listener config-ref="CustomerAPI-httpListenerConfig" path="/api/*" doc:name="HTTP" />
<http:basic-security-filter realm="mule-realm" securityProviders="memory-provider" />

<mule-ss:security-manager xmlns:mule-ss="http://www.mulesoft.org/schema/mule/spring-security" name="muleSecurityManager">
    <mule-ss:delegate-security-provider name="memory-provider" delegate-ref="authenticationManager" />
</mule-ss:security-manager>

现在,我所期望的是,来自角色为 ROLE_USER (具有user/user凭据)的用户的请求只能访问GET以及来自角色为 ROLE_ADMIN (使用admin/admin凭据)可以访问GET和POST。

但我错了。来自 ROLE_USER 的用户的请求访问POST和GET,这是我从未预料到的。

有谁能以正确的方式指导我达到上述要求?

2 个答案:

答案 0 :(得分:3)

您可以通过spring-security设置此示例raml-intro来设置api。在这种情况下,我使用security.properties来管理用户和角色。

正如你在那些lines中看到的那样,我有一个处理安全访问的流程,但没有角色的限制。

为了处理角色,您可以修改代码并添加以下行

<mule-ss:authorization-filter requiredAuthorities="ROLE_ADMIN"/>

您的流程应如下所示:

<flow name="get:/publishers:publishers-config">
    <mule-ss:http-security-filter realm="mule-realm"
        securityProviders="security-provider"/>
    <mule-ss:authorization-filter requiredAuthorities="ROLE_ADMIN"/>
    <set-payload
        value="[{&#xA;  &quot;id&quot; : 1,&#xA;  &quot;name&quot; : &quot;DC Comics&quot;&#xA;},&#xA;{&#xA;  &quot;id&quot; : 2,&#xA;  &quot;name&quot; : &quot;Marvel Comics&quot;&#xA;}]"
        doc:name="Set Payload" />
</flow>

答案 1 :(得分:2)

如果您想基于Htttp方法实施授权,可以使用下一个示例:

<ss:authentication-manager xmlns:ss="http://www.springframework.org/schema/security" alias="authenticationManager">
    <ss:authentication-provider>
        <ss:user-service id="userService">
            <ss:user name="user" password="user" authorities="ROLE_USER" />
            <ss:user name="admin" password="admin" authorities="ROLE_ADMIN,ROLE_USER" />
        </ss:user-service>
    </ss:authentication-provider>
</ss:authentication-manager>

{...}

<flow name="testingFlow">
    <http:listener config-ref="HTTP_Listener_Configuration2" path="/*" doc:name="HTTP" allowedMethods="GET,POST"/>

    <http:basic-security-filter realm="mule-realm"/>
    <set-variable variableName="method" value="#[header:INBOUND:http.method]" doc:name="method rest" />

    <choice>
        <when expression="method.equals('GET')">
            <mule-ss:authorization-filter requiredAuthorities="ROLE_USER"/>
        </when>
        <when expression="method.equals('POST')">
            <mule-ss:authorization-filter requiredAuthorities="ROLE_ADMIN"/>
        </when>
    </choice>       
</flow>

请注意,必须将角色ROLE_ADMIN和ROLE_USER分配给用户admin,因为“mule-ss:authorization-filter”不允许使用多个值。