我们为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.
配置被忽略,用户未经过身份验证,可能是因为使用defaut检索器返回未找到的长链接用户名 在底层的ldap系统......
相同的配置适用于tomcat 7.我无法真正看到我们做错了什么。记录了X509UsernameRetrieverClassName。 https://tomcat.apache.org/tomcat-6.0-doc/config/realm.html#JNDI_Directory_Realm_-_org.apache.catalina.realm.JNDIRealm 有没有人有任何想法?
感谢, 迈克尔
答案 0 :(得分:0)
解决了这个问题。 在版本6.0.36之前,X509UsernameRetriever类不会出现在tomcat 6中。因此在6.0.32版本中忽略该属性
解决方法是在自定义类中覆盖JNDIRealm.getPrincipal(X509Certificate usercert)。