java - X509UsernameRetrieverClassName 在 tomcat 6 配置中被忽略

标签 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.

配置被忽略并且用户未通过身份验证,大概是因为使用默认检索器返回找不到的长篇大论的用户名 在底层的 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/

相关文章:

java - 我如何初始化 spring jar 和 starter 文件?

jquery - 在 tomcat 上运行 spring 应用程序时更新我的​​ html/css/js 文件的方法

java - Server-Sent-Events 如何工作

java - Jersey JSON 应用程序构建失败

java - Android Studio 没有与我的 PHP 脚本通信

java - 如何在 JPanel 中显示图像

java - 查询没有结果 JDBCTemplate

java - 带有 MS SQL Server 驱动程序和 Tomcat 的 Spring Boot

Java 正则表达式 : Match text between two strings with boundary conditions

java - Android - 使用来自网络的字符串作为对象枚举