Передача дополнительных параметров в j_security_check

#java #parameters #jaas #j-security-check

#java #параметры #jaas #j-проверка безопасности

Вопрос:

В нашем приложении нам нужно разрешить пользователю выбирать нужный источник данных при входе в систему с помощью аутентификации на основе форм, и я не уверен, возможно ли это вообще при использовании стандартной аутентификации на основе форм. Я слышал, что это возможно с помощью TextInputCallback, но понятия не имею, как (и где) это реализовать.

Комментарии:

1. TextInputCallback является частью JAAS.

Ответ №1:

В web.xml нем может быть максимум один <login-config> тег. Это означает, что вы не можете использовать более одной области в одном веб-приложении. Итак, вам нужно более или менее специфичное для контейнера решение.

В Tomcat есть CombinedRealm, который может использовать другие области.

Реализация области, содержащая одну или несколько областей. Аутентификация выполняется для каждой области в том порядке, в котором они были настроены. Если какая-либо область аутентифицирует пользователя, аутентификация завершается успешно. При объединении областей имена пользователей должны быть уникальными во всех объединенных областях.

Возможно, это соответствует вашим требованиям. Если нет, и пользователи существуют более чем в одной области (с одним и тем же именем пользователя), вы можете использовать префиксы. Например, установить "domainmyuser" в качестве имени пользователя.

Если вы используете вложенные JDBCRealm s, вы можете создать представление базы данных, которое содержит имена пользователей с префиксами (просто соедините префикс с именем пользователя) и использовать это представление в качестве таблицы пользователей.

Другой подход заключается в удалении префикса в пользовательской области и вызове контейнера JDBCRealm (или других его областей), но для этого требуется некоторое кодирование. В любом случае, это не должно быть слишком сложно, уже существующие области, вероятно, можно использовать с шаблоном проектирования делегатов.

Комментарии:

1. Если я правильно понял вашу идею, мне нужно изменить базу данных, чтобы сделать это. Но как насчет использования AbstractRoutingDataSource от Spring для переключения между ними? Это проект миграции / интеграции, поэтому мы не можем изменять настройки базы данных или добавлять в нее что-либо новое.

2. Если вы используете CombinedRealm и базы данных не содержат одно и то же имя пользователя, вам не нужно создавать новое представление. Если вы используете CombinedRealm и базы данных содержат одно и то же имя пользователя, вы можете написать пользовательскую область (без изменения баз данных). Я ничего не знаю о Spring AbstractRoutingDataSource .