CLIENT-CERT auth方法可以与tomcat中的JDBC领域一起使用吗?

时间:2008-10-02 15:47:14

标签: java web-services authentication tomcat authorization

JDBC领域指定用于身份验证的表结构,其中包含属性userNameCol和userCredCol定义的列。这些对应于用户和密码,这对FORM或BASIC auth方法有意义。它们是交互式的,需要来自客户端用户的这两个部分。

  • 从中回来的是什么 证书?
  • 数据示例是什么? 存储在userNameCol和 userCredCol看起来像?
  • 是否有替代表格 这个领域的结构 情况?

PS - 我正在使用tomcat 5.5.x。

1 个答案:

答案 0 :(得分:5)

JDBCRealm支持CLIENT-CERT

是的,它可以。但是,有一些怪癖需要注意。

用户名

用户名列应包含证书主题的可分辨名称,作为字符串。不幸的是,Tomcat用于获取此字符串的方法会产生依赖于实现的结果,因此如果您切换到新的安全提供程序甚至只是升级Java运行时,您可能需要将用户名映射到新表单。您必须测试部署以找出使用的格式。

具体而言,在getName()返回的Principal上调用X509Certificate.getSubjectDN()以获取String,该JDBCRealm用作用户名。如果您阅读documentation,,您会发现这不再是最佳方法。

验证

最简单的设置是将您的信任锚加载到Tomcat's trust store中,该Principal在“server.xml”文件中配置。通过此设置,任何一个受信任的CA中的根目录的客户端证书链都将被视为“已通过身份验证”,并且正确的身份验证意味着身份已知,并且与授权不同,授权确定允许该身份的身份。做。

授权

由于任何拥有签名证书的人都将通过身份验证,因此您需要设置角色以保护应用程序中的私有资源。这是通过在“web.xml”文件中设置与角色关联的安全性约束来完成的。然后,在您的数据库中,填充“roles”表以向可信用户授予额外角色。

用户表和角色表之间的关系与基于FORM的授权完全相同,应该用于向您信任的用户授予适当的权限。

关于密码的说明

Principal将创建一个新的GenericPrincipal,它带有密码,但除非您的应用程序将此NULL向下转发到特定于Tomcat的实现(FORM-based JDBCRealm),您将无法看到此属性,并且您在该列中放置的内容并不重要。我推荐JDBCRealm

换句话说,将GenericPrincipal与client-auth一起使用时,将忽略密码字段。这个Principal有一个访问底层主体的方法,但不幸的是,证书中的JDBCRealm没有被传递; getName()将其设置为null;这种情况下唯一有用的方法可能是NULL(返回主题DN可能是非标准形式)。

表格结构和内容

使用与{{3}}(或DatasourceRealm)完全相同的表结构。唯一的区别在于内容。用户名将是主题专有名称的文本表示,密码将为{{1}}或某个虚拟值。