, поэтому наше веб-приложение Spring Security в настоящее время имеет два типа пользователей:
1) Пользователи с ролями, которые сохраняются в базе данных и доступны через обычную службу UserDetailsService:
authenticationManagerBuilder
.userDetailsService(userDetailsService)
.passwordEncoder(bCryptPasswordEncoder());
@Service class UserServiceImpl implements UserService {
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Autowired
private UserRepository userRepository;
@Autowired
private UserRoleRepository userRoleRepository;
@Override
@Transactional
@PostUpdateInternalMemoryAdminUser
public void save(final User user) {
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
userRepository.save(user);
}
@Override
public User loadUserByUsername(final String username) {
return userRepository.findByUsername(username).orElseThrow(() ->
new UsernameNotFoundException(username));
}
@Override
@Transactional
@PostUpdateInternalMemoryAdminUser
public void update(final User user) {
//TODO: Implement
}
@Override
@Transactional
@PostUpdateInternalMemoryAdminUser
@PostVerifyCurrentUserDetailsPresenceInPersistentResource
public void deleteById(final UUID id) {
//TODO: Implement
}
@Override
public boolean canFindByUsername(String username) {
return userRepository.findByUsername(username).isPresent();
}
}
2) Жестко запрограммированная роль администратора InMemory, которую пользователь должен разблокировать только в том случае, если в базе данных нет пользователей роли администратора:
authenticationManagerBuilder
.inMemoryAuthentication()
.withUser(BASE_ADMIN_USERNAME)
.password(bCryptPasswordEncoder().encode(BASE_ADMIN_PASSWORD))
.authorities(adminUserRole.getGrantedAuthorities()
.toArray(GrantedAuthority[]::new))
.roles(adminUserRole.name())
.accountLocked(userRoleService.hasAnyAdminRoles());
Это означает, что пользователь InMemory должен быть разблокирован только тогда, когда приложение запускается в первый раз или в качестве запасной точки, когда все пользователи Admin в базе данных были удалены вошедшим в систему пользователем Admin. Последнее поведение допускается из-за того, что пользователи-администраторы могут даже свободно удалять свою собственную учетную запись, после чего их сеанс прекращается.
К сожалению, в таком случае это приводит к проблеме, когда In-Memory Пользователь должен быть снова разблокирован программно. Точно так же, когда администратор In-Memory создает нового администратора, хранящегося в базе данных, его текущий сеанс должен быть прерван, а учетная запись должна быть заблокирована.
Однако я не знаю, как мне получить доступ к этому In-Memory. Пользователь памяти и извлекает сеансы, вошедшие под ним, а также, как мне установить их учетную запись как заблокированную / разблокированную.
Важное примечание: еще раз администратор в памяти является точка запуска / возврата для нашего веб-приложения и не должна сохраняться в базе данных, что, к сожалению, привело к этой проблеме.
Прошу прощения, если не все это имело смысл, как и я все еще пытаюсь понять запутанный характер этой проблемы.
Любая помощь / решения будут оценены.