我的mongodb设置为使用Kerberos,当我从shell访问数据库时一切正常。
现在我需要我的Java应用程序也连接到数据库,使用Kerberos进行身份验证。除http://docs.mongodb.org/ecosystem/tutorial/authenticate-with-java-driver/中的几行外,我还没有找到如何使这项工作。
我的主要用例比该页面上描述的更难。我有一个为多个用户提供服务的tomcat服务器 - 所以我需要用户登录应用程序并提供他们的主体名称和密码,我希望Java服务器对KDC进行身份验证,然后使用提供的机票来mongodb - 我可以找不到办法做到这一点。
如果这是不可能的,我必须为每个用户使用一个单独的tomcat服务器,我假设我可以做一个kinit然后启动tomcat?这意味着每个用户都必须运行自己的服务器。不是很好 - 但即使在这里 - 我需要做什么才能使Java进程在会话中使用任何kinit放置。
关于如何做到这一点的任何其他建议也非常感激(例如,我在tomcat中运行的servlet可以从用户的浏览器获取Kerberos票证吗?没有火箭科学和昂贵的许可证......)。我想做的就是允许人们使用Kerberos凭证登录mongodb - 但是通过Java应用程序。
答案 0 :(得分:0)
10gen / MongoDB提供的Java Driver仅支持通过kinit进行Kerberos身份验证。要让Tomcat实例使用不同的主体进行身份验证,您不仅需要运行不同的实例,而且这些实例必须在不同的系统帐户下运行。这是因为kinit savint系统临时目录中文件中的凭证/票证。这就是为什么你可以在一个终端中进行kinit然后从另一个终端登录到服务器的原因。凭证是帐户的全局凭证,实际上您一次只能为帐户使用1个本金。这是我们发现kinit对运行服务不满意的众多原因之一。
我在Asynchronous Java Driver上工作,它支持3种为Kerberos身份验证提供凭据的机制:
用户名或密钥选项卡文件应该适用于您的用例。有关kerberos支持的详细信息,请here。从该页面开始,身份验证可以如下所示:
MongoClientConfiguration config = new MongoClientConfiguration("mongodb://locahost:27017/");
char[] password = new char[] { 's', 'u', 'p', 'e', 'r',
's', 'e', 'c', 'r', 'e', 't' };
config.addCredential(Credential.builder()
.userName("<user>@<REALM>")
.password(password)
.kerberos());
Arrays.fill( password, ' ' );
一些注意事项:
HTH, 罗布。
答案 1 :(得分:0)
与MongoDB Java驱动程序一起使用的一个很好的技巧是使用系统的Kerberos票证。 所以,你可以使用类似的东西:
sudo -u tomcat kinit application/username@REALM
现在,根据KDC的配置,您可能需要不时续订凭据,以便进行此项使用:
sudo -u tomcat kinit -R
如上所述,Kerberos支持仅适用于MongoDB Enterprise,可以从MongoDB网站下载。