使用CXF和Kerberos身份验证的Restful服务

时间:2016-02-11 16:24:20

标签: tomcat jax-rs cxf kerberos

很难尝试使用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状态代码的程度。

我被困住了。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

你必须考虑这个问题:

  1. 使用this此身份验证器。最好来自trunk或Apache Web Server this
  2. 如果CXF使用Apache HTTP Client,请忘掉它。目前的代码很糟糕。见HTTPCLIENT-1625

答案 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。 然后客户端将再次发送请求,但这次它在其标头元数据中包含一个标记。现在响应应该符合预期。

这对我有用。我希望它可以帮助别人。

拉​​姆齐