Настройка проверки подлинности клиента-сертификата с ролями в Tomcat 6.0 - PullRequest
0 голосов
/ 23 февраля 2011

Я настраиваю веб-приложение, которое использует аутентификацию сертификата клиента. Сейчас я только что настроил тестовую учетную запись пользователя и роль «пользователя» для проверки аутентификации и авторизации. Я использую 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" />

Когда я впервые настраивал базу данных и приложение, я использовал аутентификацию FORM со следующей конфигурацией в web.xml:

<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 и назначена роль: пользователь. Вход в систему с аутентификацией 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 с указанием роли «пользователь», я получаю ошибку 403, запрещающую доступ к любой странице. Похоже, аутентификация прошла успешно, но она не может определить роль пользователя из базы данных. Если я закомментирую ограничение авторизации, аутентификация пройдет успешно, и я смогу получить доступ к защищенной странице.

Похоже, он не может найти роль пользователя в базе данных, хотя единственное, что я изменил в БД, - это то, как представляется имя пользователя. После аутентификации следующий код:

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)

Что еще я должен сделать, чтобы иметь возможность искать роли пользователей? Из всего, что я видел до сих пор, похоже, что это должно работать. Спасибо за любую помощь.

1 Ответ

1 голос
/ 23 февраля 2011

Я нашел ответ на свою проблему.

Даже если

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 = Some-State, 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 решило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...