#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
и пользовательского фильтра.