为Tomber for Kerberos和Impersonation配置Tomcat

时间:2012-07-16 07:15:15

标签: cxf tomcat7 windows-authentication kerberos spnego

我想将Tomcat配置为能够连接到AD并相应地验证用户。

此外,我还想使用客户端凭据调用一些Web服务(在本例中为Share Point)。

到目前为止,我已成功配置Tomcat以使用SPNEGO身份验证,如http://tomcat.apache.org/tomcat-7.0-doc/windows-auth-howto.html教程中所述。请注意,我使用过Tomcat的SPNEGO身份验证(不是Source Forge或Waffle)。

我没有使用Source Forge的实现,因为我想保持简单并使用开箱即用的Tomcat。此外,我希望Tomcat使用SPNEGO作为WEB.XML中的身份验证方法和Tomcat的JNDI域进行授权来处理所有身份验证和授权。

此外,我还没有使用过WAFFLE,因为这只是Windows。

我正在使用CXF作为我的Web服务堆栈。根据{{​​3}}的CXF文档,您需要做的就是使用Web服务(在我的情况下,Share Point)进行身份验证:

 <conduit name="{http://example.com/}HelloWorldServicePort.http-conduit"
   xmlns="http://cxf.apache.org/transports/http/configuration">
   <authorization>
      <AuthorizationType>Negotiate</AuthorizationType>
      <Authorization>CXFClient</Authorization>
   </authorization>
 </conduit>

并在jaas.conf中配置CXFClient(在我的情况下,Tomcat的服务器JAAS配置所在的位置,这样我的jass.conf看起来像:

CXFClient {
    com.sun.security.auth.module.Krb5LoginModule required client=true useTicketCache=true debug=true;
};

com.sun.security.jgss.krb5.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    principal="HTTP/tomcatsrv.corporate.intra@CORPORATE.INTRA"
    useKeyTab=true
    keyTab="C:/Program Files/Apache/apache-tomcat-7.0.27/conf/tomcatsrv.keytab"
    storeKey=true
    debug=true;
};

com.sun.security.jgss.krb5.accept {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    principal="HTTP/tomcatsrv.corporate.intra@CORPORATE.INTRA"
    useKeyTab=true
    keyTab="C:/Program Files/Apache/apache-tomcat-7.0.27/conf/tomcatsrv.keytab"
    storeKey=true
    debug=true;
};

然而,当我调用Web服务时,它是在服务用户名下调用的(即在AD和tomcatsrv.keytab中配置的Tomcat的用户名),而不是客户端的用户名(例如duncan.attard)。 / p>

所以我的问题是:是否有某种方式可以将客户端的用户名委托给CXF(或使用某种模拟),以便在我调用Share Point的Web服务时(例如我想使用Copy上传文件) .asmx),文件上传为duncan.attard而不是tomcat.srv

谢谢大家,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

从技术上讲,这非常有效。这是食谱:

  1. 如果您使用凭据委派,则不需要登录模块名称。
  2. 您必须确保该用户帐户符合授权条件。
  3. 看一下Tomcat的GenericPrincipal的实现,如果有的话,它会为你保存GSS凭证。将request.getPrincipal投射到GenericPrincipal并获取凭据。

    现在说你有凭证:

    1. 使用PrincipalGSSCredential作为私人凭据构建Subject
    2. 将CXF代码包装到PrivilegedAction
    3. 将构造的主题和特权操作的实例传递给Subject.doAs方法,系统将代表传递的主题构造AccessControlContext,并代表该上下文调用JAAS中的所有内容。 CXF应该使用那些如果它正确实现。这类似于Unix上的susudo
    4. 最简单的测试方法是代表客户端在Active Directory中创建特权操作中的InitialDirContext。这就是我测试工作凭证委派环境的方法。