Привет, у меня есть приложение в 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 извлекает информацию, относящуюся к текущему пользователю, который называет его, как я могу применить код выше для каждого пользователя в системе, из моей учетной записи администратора? Я использую собственный поставщик аутентификации.
Да, это хорошая идея, проблема заключается в том, что когда вы говорите SecurityContextHolder.getContext(). SetAuthentication (newAuth) вы ВЕ одному пользователю, что мне нужно проверку подлинности многих пользователей. Tnks –
Реализация Spring Security по умолчанию хранит токен аутентификации в объекте сеанса HTTP. Из-за соображений безопасности невозможно получить доступ к сеансам, отличным от собственных. Поэтому в стандартной среде невозможно получить доступ к токенам аутентификации «все» или «многие» пользователей. Вы можете создать пользовательскую реализацию 'SecurityContextRepository', чтобы хранить токен аутентификации, скажем, в кэше, хранящемся в ожидании. Это даст вам семантику сеанса HTTP, а также позволит вам получить доступ ко всем токенам, когда вам нужно. – manish
Пример реализации «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