我終於找到了解決方案。
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。 然後客戶端將再次發送請求,但是這次它的標題元數據中包含一個標記。現在響應應該如預期的那樣。
這適用於我。我希望它能幫助別人。
拉姆茲
如果我覺得無聊的地方,今年可能是有可能我會在這裏創造一個合適的FPGA實現。有人不太可能會給你一個有效的解決方案/答案。 –