Использование разных пользователей базы данных с GORM - PullRequest
2 голосов
/ 25 августа 2011

Я работаю над приложением Grails 1.3.7, которое по своей природе клиент хочет держать всех пользователей на уровне базы данных, чтобы он мог использовать возможности своей базы данных в отношении входа в систему, разрешений и т. Д. (База данных Oracle 10g).

Есть ли способ настроить GORM на использование другого пользователя / пароля для подключения к базе данных при входе пользователя в систему? Что-то вроде создания формы user / pass и передачи этих учетных данных в GORM для подключения к базе данных?

Какова была бы лучшая практика для реализации этого сценария?

Ответы [ 2 ]

0 голосов
/ 26 августа 2011

Другое решение (если у вас есть только одна база данных для вашего приложения и вы хотите использовать пользователей базы данных, управляемых СУБД только для аутентификации).

Вы можете использовать определенного пользователя для глобального доступа к базе данныхи напишите схему аутентификации, которая аутентифицирует пользователей, создав новое соединение с базой данных с их собственным именем пользователя и паролем.

Итак, в этой ситуации у вас будут преимущества:

  • Одна база данных (вам не нужно иметь один SessionFactory на пользователя, что в конечном итоге приведет к УНИЧТОЖЕНИЮ вашего приложения)
  • Все пользователи будут управляться СУБД, а не вашим приложением
0 голосов
/ 25 августа 2011

Я не знаю 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 ...

...