java - 未找到类异常 X509UsernameRetrieverClassName Tomcat

标签 java tomcat authentication servlets client-certificates

我正在尝试编写一个小型 Java 应用程序,通过客户端证书对用户进行身份验证。 我在 Tomcat 中看到我可以在领域描述符中指定 X509UsernameRetrieverClassName 以告诉 tomcat 使用我自己实现的将 X509 证书映射到用户名的函数。 唯一不起作用的是它没有找到我指定的类,即使我有一个包并且直接在实现函数 org.apache.catalina.realm.X509UsernameRetriever 的类中。 经过大量谷歌搜索后,我仍然没有找到这个问题的任何答案。

如有任何帮助,我们将不胜感激!

更新:

我在 webapp 的 context.xml 文件中配置了这个类:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/">
    <Realm className="org.apache.catalina.realm.MemoryRealm"
           X509UsernameRetrieverClassName="com.packagename.UserFromCert"
           pathname="conf/tomcat_users.xml"/>
</Context>

我已经按如下方式实现了该类(仅用于测试)

package com.packgename;

import java.security.cert.X509Certificate;

public class UserFromCert implements org.apache.catalina.realm.X509UsernameRetriever {

    @Override
    public String getUsername(X509Certificate x509Certificate) {
        System.out.println(x509Certificate.getSubjectDN().toString());
        System.out.println(x509Certificate.getSubjectX500Principal().getName());
        return x509Certificate.getSubjectDN().toString();
    }
}

我要实现的类在 tomcat 库中。

最佳答案

我在几年前的一份契约(Contract)中使用 Tomcat 6.0 做了一些非常相似的事情。我的内存有点模糊,我把代码留在了后面(抱歉!),但我希望这有助于引导您(或其他人)朝着正确的方向前进。

我所做的是:

1) 将Catalina源码导入Eclipse
2) 在同一个项目的新文件中创建您需要的新类——我的是一个自定义实现,用于将证书的可分辨名称中的值映射到用户名:

package org.apache.catalina.realm;
import java.security.cert.X509Certificate;

public class CustomX509SubjectDnMapper implements X509UsernameRetriever {

    public String getUsername(X509Certificate clientCert) {
        return clientCert.getSubjectDN().getName().toLowerCase();
    }
}

3) 将代码导出到新的 Catalina.jar 文件
4) 在 Tomcat 的 lib 目录中包含这个新的 Catalina.jar 文件。

我不记得我是否将自定义实现保留在同一个包中。我发现关键是将自定义实现放入 Tomcat 可以使用的自定义 Catalina.jar 中。也可以导出引用 Catalina 的独立 jar 并将其导入您的 Tomcat 容器。

无论如何,我希望这在某种程度上有所帮助,祝你好运。

关于java - 未找到类异常 X509UsernameRetrieverClassName Tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36986479/

相关文章:

java - Nimbus:找不到符号:最新版本中的 getAllClaims 方法

java - HTTP 状态 500 - 处理程序处理失败;嵌套异常是 java.lang.NoClassDefFoundError :

spring - 使用 Spring MVC 的 Tomcat Eclipse 中的 Catalina 错误

django - 如何在 Django 中使用多个用户模型?

javascript - 密码保护 HTML5 离线应用程序目录

security - 用户登录安全 - 本地 cookie 与 session

java - 如果 double 是整数,不显示小数?

java - 在 Android 上混合 guice 和 scala 时得到 "failure in processEncodedAnnotation"

java - 从 Oracle (10g) 存储过程调用 Web 服务

java - 在 Tomcat 上使用 JaCoCo Java 代理获取我的应用程序的代码覆盖率