Подключаемые модули Grails Multi-tenant & Spring Security Core - PullRequest
0 голосов
/ 23 сентября 2011

Я использую мультитенантный плагин Grails с однопользовательским режимом. Я использовал весенний плагин ядра безопасности для аутентификации. Я использовал распознаватель доменного имени. Таблица пользователей не распространена в базе данных по умолчанию. У каждого арендатора базы данных есть свои пользовательские таблицы. Он работает нормально, за исключением следующих 2 вопросов.

  1. Когда пользователь клиента (арендатора) пытается войти в систему, иногда он попадает в базу данных по умолчанию и говорит «Пользователь не найден». Если я попытаюсь после обновления страницы (введите URL-адрес и нажмите CTRL + F5), он будет правильно зарегистрирован.

  2. У меня есть общий пользователь для арендаторов с разными правами доступа. Сначала я открываю свое приложение в браузере с одним URL-адресом клиента, авторизируюсь с учетными данными и успешно вошел в систему. Затем я открываю другую вкладку в том же браузере, вводим второй URL и учетные данные для входа. Здесь я могу войти в приложение, но я получаю разрешения 1-го арендатора. Если я выхожу из системы и обновляю страницу, как указано выше, или если я обновляю страницу перед входом в систему и пытаюсь, она работает нормально.

При отладке я обнаружил, что перед разрешением арендатора Spring Security обращается к базе данных с предыдущим сеансом DB.

Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 02 января 2012

Когда запрос попадает на мою страницу входа в систему, я получаю tenantId и сохраняю его в сеансе.

Integer tenantId = tenantResolver?.getTenantFromRequest(request)
if (session.tenantId == null) {
   session.tenantId = tenantId
}

Чтобы получить информацию о зарегистрированных пользователях, я переопределяю метод loadUserByUsername, реализуя GrailsUserDetailsService и вызываяв рамках сделки.

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  def requst = SecurityRequestHolder.request
  def httpSession = requst.getSession(false)
  Integer tenant = httpSession.tenantId
  TenantUtils.doWithTenant (tenant) {
 User.withTransaction { status ->
       User user = User.findByUsername(username)
     }
  }
}

Теперь моя проблема решена.

0 голосов
/ 21 ноября 2011

Необходимо убедиться, что мультитенантный фильтр сервлетов зарегистрирован перед фильтром безопасности Spring.Я не уверен, как это сделать без перекомпиляции плагина.

...