很难尝试使用Kerberos身份验证保护现有的CXF JAX-RS服务。
我浏览了一些似乎是参考文档:http://cxf.apache.org/docs/jaxrs-kerberos.html,但它没有多大帮助。
我实际上是在尝试配置Tomcat + CXF来重现这种Apache配置(可行):
public interface IObject
{
bool isLockedList { get; }
bool IsLocked { get; }
}
private void FilterLockedEntities<T>(List<T> list) where T : IObject
{
// same code as above should work here...
}
已配置jaas.conf 和 krb5.conf 。 KerberosAuthenticationFilter 也在CXF配置中声明和引用。但我甚至无法达到获得401 Forbidden状态代码的程度。
我被困住了。非常感谢任何帮助。
答案 0 :(得分:2)
你必须考虑这个问题:
答案 1 :(得分:2)
我最终找到了解决方案。
CXF提供KerberosAuthenticationFilter但请不要使用CXF 3.0.1 。有一个错误引发了NullPointerException。它被固定在以下版本中(我无法分辨哪一个)。切换到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/serviceprincipal@MYDOMAIN.COM"/>
</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)在Tomcat配置路径中添加JAAS配置文件jaas.conf($ CATALINA_HOME / conf /):
mycontext {
com.sun.security.auth.module.Krb5LoginModule required
doNotPrompt=true
principal="HTTP/serviceprincipal@MYDOMAIN.COM"
useKeyTab=true
keyTab="/path/to/keytab/HTTP-serviceprincipal.keytab"
debug=true
storeKey=true;
};
4)安装krb5-user和curl进行测试:
$ kinit (to authenticate againt the KDC)
$ klist (to verify)
$ curl --negotiate -u : http://serviceprincipal/rest/someservice
此处客户端(curl)将向我们的受保护服务器发送请求。服务器将发回包含特定标头的401 Unauthorized Status响应:WWW-Authenticate:Negotiate。 然后客户端将再次发送请求,但这次它在其标头元数据中包含一个标记。现在响应应该符合预期。
这对我有用。我希望它可以帮助别人。
拉姆齐