簡體   English   中英

在Tomcat 6.0上使用角色設置客戶端證書認證

[英]Setting up client-cert authentication with roles on Tomcat 6.0

我正在設置一個使用客戶端證書身份驗證的Web應用程序。 目前,我只是設置了一個測試用戶帳戶和一個“用戶”角色來測試身份驗證和授權。 我正在使用DataSourceRealm和配置為這樣的postgreSQL數據庫:

<Realm className="org.apache.catalina.realm.DataSourceRealm"
    dataSourceName="jdbc/postgres" localDataSource="true"
    userTable="users" userNameCol="username" userCredCol="password"
    userRoleTable="user_roles" roleNameCol="role" />

<Resource auth="Container" type="javax.sql.DataSource" name="jdbc/postgres"
    driverClassName="org.postgresql.Driver"
    url="jdbc:postgresql://localhost:5432/test"
    maxActive="100" maxIdle="30" maxWait="-1"
    username="test" password="test" />

首次設置數據庫和應用程序時,我在Web.xml中使用FORM身份驗證進行以下配置:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Test</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>

    <auth-constraint>
        <role-name>user</role-name>
    </auth-constraint>

    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/login-failed.jsp</form-error-page>
    </form-login-config>
</login-config>

數據庫包含用戶:testuser,並分配了角色:user。 使用FORM身份驗證登錄可以正常工作。

然后,我將FORM身份驗證方法更改為CLIENT-CERT,並設置了必要的證書,CA等。server.xml中的連接器配置如下:

   <Connector SSLEnabled="true" clientAuth="true"
    maxThreads="150" port="8443" protocol="HTTP/1.1" scheme="https"
    keystoreFile="C:\Workspace\Test\keystore.jks"
    keystorePass="changeit"
    truststoreFile="C:\Workspace\Test\truststore.jks"
    truststorePass="changeit"
    secure="true" sslProtocol="TLS"/>

在數據庫中將用戶標識為“ CN = testuser,O = Internet Widgits Pty Ltd,ST = Some-State,C = AU”

如果我離開auth-constraint指定“用戶”角色,則訪問任何頁面都會收到403權限被拒絕的錯誤。 看起來身份驗證已成功,但是它無法從數據庫中確定用戶的角色。 如果我注釋掉auth-constraint,則身份驗證成功,並且可以訪問受保護的頁面。

盡管我更改的數據庫中唯一的事情就是用戶名的表示方式,但是看起來它無法在數據庫中查找用戶的角色。 驗證后,以下代碼:

X500Principal p = certs[0].getSubjectX500Principal();
out.println (p.getName());

產生“ CN = testuser,O = Internet Widgits Pty Ltd,ST = Some-State,C = AU”,這是存儲在數據庫的用戶名列中的值,該值也映射到user_roles表中的“用戶”角色。

test=> select * from users;
                         username                          | password
-----------------------------------------------------------+----------
 CN=testuser,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU |
(1 row)

test=> select * from user_roles;
                         username                          | role
-----------------------------------------------------------+------
 CN=testuser,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU | user
(1 row)

我還應該做些什么才能查找用戶角色? 從目前為止我所看到的一切來看,這似乎應該可行。 謝謝你的幫助。

我找到了解決我問題的方法。

即使

X500Principal p = certs[0].getSubjectX500Principal();
out.println (p.getName());

返回主題DN為“ CN = testuser,O = Internet Widgits Pty Ltd,ST = Some-State,C = AU”,在數據庫上打開詳細日志記錄顯示“ CN = testuser,O = Internet Widgits Pty Ltd,ST =某些狀態,C = AU”(字段之間插入空格)正在查詢中提交給數據庫。

LOG:  ... execute <unnamed>: SELECT null FROM users WHERE username = $1
parameters: $1 = 'CN=testuser, O=Internet Widgits Pty Ltd, ST=Some-State, C=AU'
LOG:  ... execute <unnamed>: SELECT role FROM user_roles WHERE username = $1
parameters: $1 = 'CN=testuser, O=Internet Widgits Pty Ltd, ST=Some-State, C=AU'

似乎X509Principal.getName()返回getName(X500Principal.RFC2253) ,其中tomcat似乎正在使用getName(X500Principal.RFC1779) 更新數據庫以使用RFC 1779格式解決了我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM