2016-02-11 50 views
3

嘗試使用Kerberos身份驗證保護現有的CXF JAX-RS服務很困難。使用CXF和Kerberos身份驗證的穩定服務

我經歷了似乎是參考文檔:http://cxf.apache.org/docs/jaxrs-kerberos.html但它沒有多大幫助。

實際上,我想配置Tomcat + CXF重現這種Apache配置的(工作):

<Directory /var/www/> 
AuthType Kerberos 
KrbServiceName HTTP/[email protected] 
Krb5Keytab /path/to/file.keytab 
Require valid-user 
</Directory> 

的Jaas.conf的krb5.conf進行配置。在CXF配置中聲明並引用了KerberosAuthenticationFilter。但我甚至無法達到我獲得401 Forbidden狀態碼的地步。

我被卡住了。任何幫助將非常感激。

+0

如果我覺得無聊的地方,今年可能是有可能我會在這裏創造一個合適的FPGA實現。有人不太可能會給你一個有效的解決方案/答案。 –

回答

1

我終於找到了解決方案。

CXF提供了KerberosAuthenticationFilter,但請不要使用CXF 3.0.1。有一個引發NullPointerException的bug。它被固定在以下版本中(我不知道哪一個)。切換到CXF 3.0.8修復了這個問題。

1)你必須在你的beans.xml聲明這個過濾器:

<bean id="kerberosFilter" class="org.apache.cxf.jaxrs.security.KerberosAuthenticationFilter"> 
    <property name="loginContextName" value="mycontext"/> 
    <property name="servicePrincipalName" value="HTTP/[email protected]"/> 
</bean> 

2)並在端點定義添加引用(仍在beans.xml文件):

<jaxrs:server address="/"> 
    <jaxrs:serviceBeans> 
     <ref bean="bean1" /> 
     <ref bean="bean2" /> 
     <ref bean="bean3" /> 
    </jaxrs:serviceBeans> 
    <jaxrs:providers> 
     <ref bean="someProvider" /> 
     <ref bean="someExceptionMappper" /> 
     <ref bean="kerberosFilter" /> 
    </jaxrs:providers> 
</jaxrs:server> 

3)添加JAAS配置文件的Jaas.conf在Tomcat配置路徑($ CATALINA_HOME/CONF /):

mycontext { 
    com.sun.security.auth.module.Krb5LoginModule required 
    doNotPrompt=true 
    principal="HTTP/[email protected]" 
    useKeyTab=true 
    keyTab="/path/to/keytab/HTTP-serviceprincipal.keytab" 
    debug=true 
    storeKey=true; 
}; 

4)安裝krb5用戶並捲曲測試:

$ kinit (to authenticate againt the KDC) 
$ klist (to verify) 
$ curl --negotiate -u : http://serviceprincipal/rest/someservice 

這裏客戶端(curl)會向我們的受保護服務器發送請求。服務器將發送一個包含特定標題的401未經授權的狀態響應:WWW-Authenticate:Negotiate。 然後客戶端將再次發送請求,但是這次它的標題元數據中包含一個標記。現在響應應該如預期的那樣。

這適用於我。我希望它能幫助別人。

拉姆茲

2

你要想想這個:

  1. 使用this此認證。最好從trunk或Apache Web服務器this
  2. 如果CXF使用Apache HTTP Client,則忘記它。目前的代碼非常糟糕。見HTTPCLIENT-1625
+1

謝謝邁克爾,但它說:「由於版本7.0中的ABI更改,這隻適用於Apache Tomcat 6.0」。我們目前正在使用Tomcat 8. –

+0

@RamziOueslati,我現在正在準備2.0版本。之後,我想將它移植到Tomcat 8.代碼本身沒有什麼大的區別,但是在Tomcat界面中。從Subversion簽出,交換8.0的Tomcat依賴關係並修復接口編譯錯誤。這應該做的。 –

+0

@ Michael-O看起來很棒。你知道你的sample-webapp可以在Tomcat 8上運行嗎? –