Блокировка учетной записи / Завершение сеанса жестко запрограммированного пользователя InMemory - PullRequest
0 голосов
/ 08 февраля 2020

, поэтому наше веб-приложение 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. Пользователь памяти и извлекает сеансы, вошедшие под ним, а также, как мне установить их учетную запись как заблокированную / разблокированную.

Важное примечание: еще раз администратор в памяти является точка запуска / возврата для нашего веб-приложения и не должна сохраняться в базе данных, что, к сожалению, привело к этой проблеме.

Прошу прощения, если не все это имело смысл, как и я все еще пытаюсь понять запутанный характер этой проблемы.

Любая помощь / решения будут оценены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...