#spring-security #jwt #spring-rest
#spring-безопасность #jwt #spring-rest
Вопрос:
Как указано в названии, в настоящее время я нахожусь в процессе создания REST API, используя Spring Security для создания ролевой системы для обработки защиты конечных точек. Для этого я использую метод @PreAuthorize(«hasRole(‘ROLE_SOMEROLEHERE’)»), однако, похоже, он не распознает роли из любого запроса, который я пробовал.
Ниже я поделюсь некоторым связанным кодом, надеюсь, кто-нибудь поможет мне понять, что происходит не так. Если потребуется больше кода, чтобы увидеть, что может быть не так, я обязательно добавлю его. Заранее большое спасибо!
Контроллер лицензий
@PostMapping("/create-license")
public void createAccount(@RequestBody License licenseToCreate)
{
licenseRepository.save(licenseToCreate);
}
UserDetailsServiceImpl
public class UserDetailsServiceImpl implements UserDetailsService {
private IUserRepository userRepository;
public UserDetailsServiceImpl(IUserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
ApplicationUser foundApplicationUser = userRepository.findByUsername(username);
if (foundApplicationUser == null) {
throw new UsernameNotFoundException(username);
}
return new User(foundApplicationUser.getUsername(), foundApplicationUser.getPassword(), getAuthority(foundApplicationUser));
}
private Set getAuthority(ApplicationUser user) {
Set authorities = new HashSet<>();
authorities.add(new SimpleGrantedAuthority("ROLE_" user.getRoles().getRoleName()));
return authorities;
}
}
Комментарии:
1. hasRole(‘ROLE_SOMEROLEHERE’) является избыточным. Попробуйте удалить ROLE_, чтобы он читал hasRole(‘SOMEROLEHERE’)
2. @RobWinch попытался изменить его, как вы предложили, но в настоящее время я все еще получаю 403 запрещенных ответа, хотя у меня есть действительный JWT с правильной ролью
Ответ №1:
Вы пытались заменить @PreAuthorize("hasRole('ROLE_SOMEROLEHERE')")
на @PreAuthorize("hasAnyAuthority('ROLE_SOMEROLEHERE')")
?
Потому что в UserDetailsServiceImpl похоже, что вы назначаете полномочия пользователю.