UserDetailsService с несколькими таблицами

#spring #spring-boot #spring-security

Вопрос:

У меня есть две таблицы admin и user, но в сервисе UserDetailsService есть один метод под названием loadUserByUsername, я сделал это, чтобы проверить администратора или пользователя и загрузить данные, но есть проблема с этим, если у пользователя и администратора одно и то же имя пользователя ( 2 таблицы), как я могу это сделать?

 @Override
public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException {

    if (isValidEmailAddress(login)) {
        Admin admin = adminRepository.findByEmail(login);
        if (admin != null) {
            return new User(admin.getUsername(), admin.getPassword(), getAuthorities(admin.getRoles()));
        }

        Customer customer = customerRepository.findByEmail(login);

        if (customer != null) {
            return new User(customer.getUsername(), customer.getPassword(), getAuthorities(customer.getRoles()));
        }
    } else {
        Admin admin = adminRepository.findByUsername(login);
        if (admin != null) {
            return new User(admin.getUsername(), admin.getPassword(), getAuthorities(admin.getRoles()));
        }

        Customer customer = customerRepository.findByUsername(login);

        if (customer != null) {
            return new User(customer.getUsername(), customer.getPassword(), getAuthorities(customer.getRoles()));
        }
    }

    throw new UsernameNotFoundException("username not found");
}
 

Ответ №1:

Если это все еще вариант для вас, возможно, лучше перенести всех пользователей в одну таблицу, чтобы исключить дубликаты. Их роль можно выделить в role столбце или связанной roles таблице.

Если нет, это будет зависеть от того, как вы определяете, входит ли администратор в систему или нет.

Некоторые приложения будут делать это по URL-адресу. Например, администраторы будут входить в систему, используя конечную точку, как /admin/login и другие, которые будут использовать /user/login . Как правило, однако, что-то из запроса должно дать вашей системе подсказку о том, что это за пользователь. Чтобы достичь этого в Spring Security, рассмотрите возможность использования AuthenticationManagerResolver и пользовательского фильтра.