Создать собственный HTTP-аутентификатор для Tomcat 9 - PullRequest
0 голосов
/ 28 декабря 2018

Мне нужно интегрировать IBM Security Access Manger с Tomcat 9 для аутентификации пользователей.У меня правильно настроен Webseal (соединение) для части IBM SAM.Он принимает учетные данные пользователя, снова аутентифицирует сервер SAM, а затем в случае успеха перенаправляет на Tomcat при передаче заголовков iv-user, iv-group и iv-creds.Теперь мне нужно написать собственный Tomcat Valve, чтобы реализовать аутентификацию и разрешить доступ к приложениям на основе группы пользователей.Каков наилучший способ сделать это?

Моя текущая идея состоит в том, чтобы расширить org.apache.catalina.valves.AuthenticatorBase, чтобы я мог использовать следующую настройку в web.xml моего приложения:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Application</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>POST</http-method>
        <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>MyRoleName</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

Заголовки из Webseal могут быть проанализированы и использованы для генерации org.apache.catalina.realm.GenericPrincipal, а затем использованы для аутентификации в роли, добавленной к данной области (или записанной в tomcat-users.xml).

I 'Я немного неуверен в том, как на самом деле реализовать эту аутентификацию, поэтому любая помощь, независимо от того, насколько базовая, будет высоко цениться.

1 Ответ

0 голосов
/ 29 декабря 2018

Самое главное - убедиться, что Tomcat не устанавливает свой собственный Authenticator в ответ на указание BASIC в качестве схемы аутентификации.Расширение из AuthenticatorBase - отличная идея, и вы можете избежать стандартного аутентификатора Tomcat, настроив свой аутентификатор в файле META-INF / context.xml вашего приложения.

Далее вам потребуется реализовать два метода.AuthenticatorBase:

  1. boolean doAuthenticate(Request request, HttpServletResponse response)
  2. String getAuthMethod()

Второй способ прост: вернуть все, что вы хотите.Возможно, вы захотите, чтобы это имело какой-то смысл, например "IBMSAM".

Первый, конечно, где лежит мясо аутентификатора.

Если вы можете получить все, что вынужно от request, тогда это здорово: оно уже есть, так что вы можете получить то, что вам нужно.Ваш метод должен сделать две вещи:

  1. Установить principal запроса на соответствующее значение (например, request.setUserPrincipal(new GenericPrincipal(username, null, roles));
  2. Return true

Я думаю, как только вы начнете работать с простой ситуацией, вы сможете поиграть с крайними случаями оттуда.

...