2015-11-04 64 views
2

我想爲我的mule應用程序實現HTTP基本身份驗證,它在HTTP上偵聽,URI是http://localhost:8082/api/customers。讓我們假設只支持POST和GET。Mule HTTP基本身份驗證和攔截url

我想以這樣的方式

  • 如果用戶有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> 

後來我想攔截的URL

<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偵聽器後,像下面

<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> 

現在,我所期望的是,請求fr om角色爲ROLE_USER(具有user/user憑據)的用戶只能訪問GET,而來自角色爲的用戶的請求ROLE_ADMIN(具有admin/admin憑據)可以同時訪問GET和POST。

但我錯了。來自角色爲ROLE_USER的用戶的請求同時訪問POST和GET,這是我從未想到的。

任何人都可以請指導我以正確的方式來達到上述要求嗎?

回答

3

你可以看到這個例子raml-intro用spring-security設置你的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> 
+0

我試過你的答案。但是在部署過程中出現錯誤:'cvc-complex-type.2.4。a:從元素'mule-ss:authorization-filter'開始找到無效的內容。 「{」http://www.mulesoft.org/schema/mule/core":annotations}'之一是預期的。「我從這個錯誤中得到的理解是我們不能在裏面有'mule-ss:authorization-filter'元素'騾子-SS:HTTP的安全filter'。如果我錯了,你能糾正我嗎? –

+0

對不起,我已經更新了我的答案。現在,它的工作。 –

2

如果要實現基於授權Http方法,你可以使用下面的例子:

<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> 

請注意,這是必要的因爲「mule-ss:authorization-filter」不允許多個值,所以將角色ROLE_ADMIN和ROLE_USER分配給用戶管理員。