Я не знаю grails, но он использует Hibernate.
Что я думаю:
Вы используете фабрику сеансов для взаимодействия с базой данных, и у каждой фабрики сеансов есть источник данных, которыйимеет URL-адрес db и le l / p.
Так что вам нужно иметь одну фабрику сеансов для каждого пользователя, чтобы вы могли подключаться к БД с разной аутентификацией.Я не вижу более простого решения.
Это означает, что вам нужны одни и те же требования для приложений с несколькими арендаторами, использующими несколько баз данных / схем.За исключением того, что вы не используете разные базы данных / схемы, а просто разные л / п.
Похоже, вы ищете плагин Multi tenant в режиме "одного арендатора": http://www.grails.org/plugin/multi-tenant
Режим одного арендатора Преобразует bean-компонент «dataSource» в прокси-сервер AOP, который создает новый источник данных для каждого арендатора
(наконец, я ошибся, вы можете использоватьфабрика одиночного сеанса и «динамический источник данных» ^^)
Редактировать:
http://grails.org/Multi-Tenant+Plugin+-+Single+Tenant+Database+Set+Up
Опция для одного арендаторанемного более незрелый, чем мультитенантный вариант.Он наследует всю конфигурацию источника данных от источника данных по умолчанию в Datasource.groovy и позволяет вам предоставить собственный URL-адрес источника данных для каждого клиента. Это означает, что вы не можете смешивать и сопоставлять драйверы или комбинации пользователей / паролей для разных арендаторов в одном и том же экземпляре.
Похоже, что в конце концов вы не можете сделать это сплагин, только изменить URL-адрес ... Как говорится, он немного незрелый, но вы, возможно, можете внести свой вклад в этот плагин, чтобы стало возможным также изменить пользователя / пароль, или просто проверить, как они это сделали и разработать свой собственный плагин...
... Или, может быть, кто-то уже разработал это ...
Edit2:
То, что вы также можете сделать:
1) Каждый раз, когда пользователь входит в систему, создайте новый источник данных, используя пользователя l / p, и добавьте его в пул источников данных (карта) (Когда он выходит из системы или истекает сеанс, удаляет этот источник данных)
2) Когда вы получаете запрос от пользователя, поместите идентификатор этого пользователя в локальный поток (с фильтром для примера).
3) Создайте новую реализацию источника данных MultiAuthentificationDatasourceImpl, в которую вы добавитепул источников данныхи сопоставьте все методы с базой данных, которую вы должны использовать.Например, ваш метод getConnection () будет выглядеть следующим образом:
public Connection getConnection() {
return getDatasourceToUse().getConnection();
}
public Datasource getDatasourceToUse() {
return datasourcePool.get( getUserIdFromThreadLocal() );
}
И почти одинаково для всех методов, вы можете повторно использовать метод getDatasourceToUse () ...
4) Использовать этот MultiAuthentificationDatasourceImplкак ваш источник данных в конфигурации Grails
Но я не знаю, Grails, просто это возможно в Java ...