2015-03-07 3 views
0

Привет, у меня есть приложение в Spring mvc 3 и Spring Security 3. Случается, что я решаю продвигать пользователя (у меня есть база данных с таблицами пользователей, ролей и user_role), но когда я добавляю новую роль в возникает проблема, как обновлять основные полномочия без выхода из системы? В поисках ответа я нашел это:reauthenticating users после их продвижения

// update database with new role 
//... you fill in this part 

// update the current Authentication 
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority> (auth.getAuthorities()); 
authorities.add(new GrantedAuthorityImpl('ROLE_NEWROLE')); 
Authentication newAuth = new UsernamePasswordToken(auth.getPrincipal(),auth.getCredentials(),authorities) 
SecurityContextHolder.getContext().setAuthentication(newAuth); 

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

ответ

0

Одним из вариантов было бы реализовать следующую стратегию:

  1. Keep глобальный реестр пользователей, чьи роли были изменены. Это может быть реализовано с использованием ConcurrentHashMap (или распределенного кеша, если у вас несколько серверов приложений).
  2. Как только администратор изменяет роль пользователя, нажмите на этот адрес (имя пользователя и т. Д.) Пользователя (чья роль была изменена).
  3. Запишите фильтр, который проверяет, является ли текущий пользователь в реестре. Если директор находится в реестре, фильтр обновляет роль пользователя, а затем удаляет принципала из реестра. Остальная часть запроса обрабатывается, как обычно.
+0

Да, это хорошая идея, проблема заключается в том, что когда вы говорите SecurityContextHolder.getContext(). SetAuthentication (newAuth) вы ВЕ одному пользователю, что мне нужно проверку подлинности многих пользователей. Tnks –

+1

Реализация Spring Security по умолчанию хранит токен аутентификации в объекте сеанса HTTP. Из-за соображений безопасности невозможно получить доступ к сеансам, отличным от собственных. Поэтому в стандартной среде невозможно получить доступ к токенам аутентификации «все» или «многие» пользователей. Вы можете создать пользовательскую реализацию 'SecurityContextRepository', чтобы хранить токен аутентификации, скажем, в кэше, хранящемся в ожидании. Это даст вам семантику сеанса HTTP, а также позволит вам получить доступ ко всем токенам, когда вам нужно. – manish

+0

Пример реализации «SecurityContextRepository» можно найти здесь (https://github.com/manish-in-java/spring-security-rest/blob/master/api/src/main/scala/org/example /api/security/EhcacheSecurityContextRepository.scala). Код находится в Scala, но вы можете легко преобразовать его в Java-код. – manish

 Смежные вопросы

  • Нет связанных вопросов^_^