JDBC 域指定了一个用于身份验证的表结构,其中包含由属性 userNameCol 和 userCredCol 定义的列。这些对应于对 FORM 或 BASIC 身份验证方法有意义的用户和密码。它们是交互式的,需要客户的用户提供这两部分内容。
- 返回什么 证书?
- 数据的例子是什么 存储在 userNameCol 和 userCredCol 长什么样?
- 是否有替代表 这个领域的结构 案例?
PS - 我使用的是 tomcat 5.5.x。
最佳答案
JDBCRealm 支持客户端证书
是的,它可以。但是,有一些怪癖需要注意。
用户名
用户名列应包含证书主体的专有名称,作为字符串。不幸的是,Tomcat 用于获取此字符串的方法会产生依赖于实现的结果,因此如果您要切换到新的安全提供程序或者甚至只是升级您的 Java 运行时,您可能需要将您的用户名映射到一个新的表单.您必须测试您的部署以找出使用的格式。
具体来说,getName()
是在X509Certificate.getSubjectDN()
返回的Principal
上调用,得到一个String
,用作用户名。如果您阅读 documentation,您会发现这不再是最佳方法。
身份验证
最简单的设置是将您的信任 anchor 加载到 Tomcat's trust store 中,这是在“server.xml”文件中配置的。通过此设置,任何在您受信任的 CA 中作为根的客户端证书链都将被视为“已通过身份验证”,这是正确的——身份验证意味着身份是已知的,并且与授权不同,授权决定了允许该身份做什么做。
授权
由于任何拥有签名证书的人都将通过身份验证,因此您需要设置角色以保护应用程序中的私有(private)资源。这是通过在“web.xml”文件中设置与角色关联的安全约束来完成的。然后,在您的数据库中,填充“角色”表以授予受信任的用户额外的角色。
用户表和角色表之间的关系与基于 FORM 的授权完全一样,应该用于向您信任的用户授予适当的权限。
关于密码的注意事项
JDBCRealm
将创建一个新的 Principal ,它确实带有密码,但除非您的应用程序将此 Principal
向下转换为特定于 Tomcat 的实现 ( GenericPrincipal ),否则您将看不到此属性,并且它并不重要您在该栏中输入的内容。我推荐 NULL
。
换句话说,当使用带有客户端身份验证的JDBCRealm
时,密码字段将被忽略。这个 GenericPrincipal
有一个访问底层委托(delegate)人的方法,但不幸的是,证书中的 Principal
没有被传递; JDBCRealm
会将其设置为 null;在这种情况下唯一有用的方法可能是 getName()
(返回主题 DN 可能是某种非标准形式)。
表结构和内容
使用与 FORM-based JDBCRealm 完全相同的表结构(或数据源领域)。唯一的区别在于内容。用户名将是主体可分辨名称的文本表示,密码将是 NULL
或某个虚拟值。
关于java - CLIENT-CERT auth-method 可以与 tomcat 中的 JDBC 域一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/163113/