在tomcat 6配置中忽略X509UsernameRetrieverClassName

时间:2014-04-25 10:21:05

标签: java tomcat

我们为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 有没有人有任何想法?

感谢, 迈克尔

1 个答案:

答案 0 :(得分:0)

解决了这个问题。 在版本6.0.36之前,X509UsernameRetriever类不会出现在tomcat 6中。因此在6.0.32版本中忽略该属性

解决方法是在自定义类中覆盖JNDIRealm.getPrincipal(X509Certificate usercert)。