2016-05-02 77 views
1

我正在嘗試編寫一個小的Java應用程序,通過客戶端證書對用戶進行身份驗證。 我在Tomcat中看到我可以在領域描述符中指定X509UsernameRetrieverClassName來告訴tomcat使用我自己的將X509證書映射到用戶名的函數的實現。 唯一不起作用的是它沒有找到我指定的類,即使我有一個包並且直接在實現函數org.apache.catalina.realm.X509UsernameRetriever的類中。 谷歌搜索後,我仍然沒有找到任何答案這個問題。類未找到異常X509UsernameRetrieverClassName Tomcat

任何幫助,將不勝感激!

UPDATE:

我配置這個類我context.xml文件爲web應用程序:

<?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庫中。

+1

如果包含Tomcat配置文件,這可能會有幫助。另外,這個實施課程是如何包含的?它是否在戰爭?它在Tomcat的lib目錄中嗎? – rmlan

+0

你把你的課放在哪裏?在你的戰爭中? –

+0

我把我的課程直接放在包裏。它被部署到戰爭內的tomcat我猜。 –

回答

0

幾年前,我在前一份合同中與Tomcat 6.0做了非常類似的事情。我的記憶有點朦朧,我留下了代碼(對不起!),但我希望這有助於引導您(或其他人)走向正確的方向。

我所做的是:

1)導入卡塔利娜源代碼到Eclipse
2)創建新的類(ES)你在同一個項目 - 礦井內的新文件需要被一個定製實現在證書的專有名稱值映射到一個用戶名:

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並將其導入到Tomcat容器中的自包含的jar。

無論如何,我希望這有助於一些能力,祝你好運。