Spring Security @PreAuthorize не видит роль при входящем запросе

#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 похоже, что вы назначаете полномочия пользователю.