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