java - CLIENT-CERT auth-method 可以与 tomcat 中的 JDBC 域一起使用吗?

标签 java web-services authentication tomcat authorization

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/

相关文章:

java - SWT - 标题区域对话框

android - NTAG213 : Android throws IOException when trying to authenticate with wrong password

ASP.NET/MySQL : Access denied for user '' @'localhost' (using password: NO)

java - 添加来自不同文件的项目并使用数组列表将它们存储在另一个文件中

java - 放心 : posting json request having both String and Integer

java - 如何在Web服务启动时加载方法

.net - 用于 Web 服务数据源的 ORM?

node.js - 最安全的 node.js/express 认证机制

java - 有一个函数依赖于 Java 中未指定的类

web-services - 在前端的数据库中检索 Magento 购物车商店?