6

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

  • 从证书中返回什么?
  • 存储在 userNameCol 和 userCredCol 中的数据示例是什么样的?
  • 在这种情况下,领域是否有替代表结构?

PS - 我使用的是 tomcat 5.5.x。

4

1 回答 1

5

JDBCRealm 支持 CLIENT-CERT

是的,它可以。但是,很少有需要注意的怪癖。

用户名

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

具体来说,在返回的时候getName()被调用来获取a ,作为用户名。如果您阅读文档,您会发现这不再是最好的方法。PrincipalX509Certificate.getSubjectDN()String

验证

最简单的设置是将您的信任锚加载到Tomcat 的信任库中,该信任库在“server.xml”文件中配置。使用此设置,位于您的受信任 CA 中的任何客户端证书链都将被视为“经过身份验证”,这是正确的 - 身份验证意味着身份是已知的,并且与授权不同,授权决定了允许该身份的内容做。

授权

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

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

关于密码的说明

JDBCRealm创建一个新的Principal,它确实带有密码,但除非您的应用程序将其向下转换Principal为特定于 Tomcat 的实现(GenericPrincipal),否则您将看不到此属性,并且您输入的内容并不重要那一栏。我推荐NULL

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

表结构和内容

使用与基于 FORM 的 JDBCRealm(或 DatasourceRealm)完全相同的表结构。唯一的区别在于内容。用户名将是主题专有名称的文本表示,密码将是NULL或一些虚拟值。

于 2008-10-03T06:36:49.780 回答