Конечная точка входа возвращает 403, запрещая в почтовом человеке, но аутентификация браузера работает (весенняя загрузка)

Я пытаюсь защитить/авторизовать свои конечные точки с помощью JWT. Токен должен быть сгенерирован после успешного входа в систему. Проблема в том, что каждый раз, когда я вызываю конечную точку входа http://localhost:8080/login и передаю учетные данные, она возвращает ответ 403. Вот моя весенняя конфигурация безопасности

@Configuration
public class SecurityConfig {
    
    @Autowired
    private UserDetailsServiceImpl userDetailsService;

   
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((authz) -> authz.anyRequest().authenticated()).httpBasic(withDefaults());
        return http.build();
    }


    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
    {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }

    @Bean
    public AuthenticationManager getAuthenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }


    protected void configure(HttpSecurity http) throws Exception{
        http.cors().and().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests().antMatchers(HttpMethod.POST, "/login").permitAll().anyRequest().authenticated();

    }
   

}

Вот мой ЛогинКонтроллер

@RestController
public class LoginController {

    @Autowired
    private JwtService jwtService;

    @Autowired
    AuthenticationManager authenticationManager;

    @RequestMapping(value = "/login", method=RequestMethod.POST)
    
    public ResponseEntity<?> getToken(@RequestBody AccountCredentials credentials) {
        // Generate token and send it in the response 
        //Authorization
        // header
        UsernamePasswordAuthenticationToken creds = new UsernamePasswordAuthenticationToken(credentials.getUsername(), credentials.getPassword());
        Authentication auth = authenticationManager.authenticate(creds);
        String jwts = jwtService.getToken(auth.getName());

        return  ResponseEntity.ok().header(HttpHeaders.AUTHORIZATION, "Bearer " + jwts).
        header(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "Authorization").build();

    }
}


Вот моя реализация UserServiceImplementation

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserRepository repository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<User> user =
        repository.findByUsername(username);
        UserBuilder builder = null;
        if (user.isPresent()) {
            User currentUser = user.get();
            builder =
            org.springframework.security.core.userdetails.
            User.withUsername(username);
            builder.password(currentUser.getPassword());
            builder.roles(currentUser.getRole());
        } else {
            throw new UsernameNotFoundException("User not found.");
        }
        return builder.build();
    }

}

Если я захожу на http://localhost:8080/api в браузере и аутентифицируюсь, все работает.

Это мой запрос почтальона

Я включил отладку. Вот журналы при вызове конечной точки.

Я не знаю, что я делаю неправильно, пожалуйста, помогите.

Кто (как вы думаете) вызывает/вызывает configure(Global) методы?

xerx593 08.10.2022 13:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
131
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Переместите csrf.disable() и другие конфигурации из метода protected void configure(HttpSecurity http) в метод SecurityFilterChain filterChain(HttpSecurity http).

Объяснение:

Проблема здесь в вашем классе SecurityConfig. Поскольку ваш класс не расширяет WebSecurityConfigurerAdapter, protected void configure (HttpSecurity http) не окажет никакого влияния на ваше приложение. Все настройки применяются из метода @Bean SecurityFilterChain filterChain(HttpSecurity http).

Измените метод ниже:

protected void configure(HttpSecurity http) throws Exception {
  http
    .cors()
    .and()
    .csrf()
    .disable()
    .sessionManagement()
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    .and()
    .authorizeRequests()
    .antMatchers(HttpMethod.POST, "/login")
    .permitAll()
    .anyRequest()
    .authenticated();
}

К:

protected void configure(HttpSecurity http) throws Exception{
  http
    .cors()
    .and()
    .csrf()
    .disable()
    .sessionManagement()
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    .and()
    .authorizeRequests()
    .httpBasic()
    .and()
    .antMatchers(HttpMethod.POST, "/login")
    .permitAll()
    .anyRequest()
    .authenticated();
}

Вы должны добавить httpBasic() к этому методу

Также вы отправляете имя пользователя и пароль с вкладки авторизации в почтальоне напрямую, выбрав базовую опцию аутентификации. И попробуйте получить доступ к любой защищенной ссылке.

[Это покажет, как выбрать базовую аутентификацию]

замените этот код на configure (HttpSecurity).

protected void configure(HttpSecurity http) throws Exception{
        http.cors().and().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests().antMatchers(HttpMethod.POST, "/login").permitAll().and().httpBasic();

    }

Другие вопросы по теме