我们已经为 tomcat 6.0.32 安装配置了 JNDIRealm。 客户端通过 Client-Cert 身份验证获得对 webapp 的访问权限。用户名 从证书中提取的格式为“CN=..., OU=.., O=.., L=.., ST=..”
因为我们只对 CN 的值感兴趣,所以我们编写了一个 X509UsernameRetrieverClass,将 jar 放在 $TOMCAT_HOME/lib 中,然后 在 JNDIRealm 中配置它:
<Context docBase="MYApp.war" path="/myapp" reloadable="true">
<Realm
X509UsernameRetrieverClassName="com.my.custom.X509UsernameRetriever"
authentication="simple"
className="org.apache.catalina.realm.JNDIRealm"
connectionName="ldapuser"
connectionPassword="****"
connectionURL="ldap://localhost:389"
roleBase="xxxx"
roleName="cn"
roleSearch="(member={0})"
roleSubtree="true"
userBase="xxxx"
userSearch="(cn={0})"
userSubtree="true"/>
</Context>
但是,当 tomcat 启动时,我们会收到以下警告:
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context/Realm} Setting property 'X509UsernameRetrieverClassName' to 'com.my.custom.X509UsernameRetriever' did not find a matching property.
配置被忽略并且用户未通过身份验证,大概是因为使用默认检索器返回找不到的长篇大论的用户名 在底层的 ldap 系统中...
相同的配置在 tomcat 7 上运行良好。我真的看不出我们做错了什么。 X509UsernameRetrieverClassName 已记录在案。 https://tomcat.apache.org/tomcat-6.0-doc/config/realm.html#JNDI_Directory_Realm_-_org.apache.catalina.realm.JNDIRealm 有人有什么想法吗?
谢谢, 迈克尔
最佳答案
解决了这个问题。 X509UsernameRetriever 类直到版本 6.0.36 才出现在 tomcat 6 中。因此该属性在 6.0.32 版本中被忽略
解决方法是覆盖自定义类中的 JNDIRealm.getPrincipal(X509Certificate usercert)。
关于java - X509UsernameRetrieverClassName 在 tomcat 6 配置中被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23290344/