Spring Security всегда возвращает 401 при входе в систему

Я новичок в Java и Spring.

Каждый раз, когда я отправляю почтовый запрос на свой сервер с данными пользователя, который уже существует в моей базе данных, я всегда получаю неавторизованный ответ 401, и я не знаю, почему.

Конфигурация безопасности

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {

@Autowired
AuthUserService authUserService;


@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.csrf().disable();
    http.headers().frameOptions().disable();

    http.httpBasic().authenticationEntryPoint(new BasicAuthenticationEntryPoint());

    http.authorizeHttpRequests()
        .requestMatchers(HttpMethod.POST, "/api/v1/login").authenticated()
        .and()
        .authorizeHttpRequests().anyRequest().permitAll();

    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

    return http.build();
}

protected void configure (AuthenticationManagerBuilder auth) throws Exception{
    auth.userDetailsService(authUserService).passwordEncoder(passwordEncoder());
}

@Bean
public PasswordEncoder passwordEncoder(){
    return new BCryptPasswordEncoder();
}

}

прочитайте свои журналы отладки, и, пожалуйста, сделайте это, прежде чем спрашивать здесь.

Toerktumlare 03.04.2023 22:32
2
1
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы используете учетные данные пользователя из базы данных для входа в систему, вам нужно использовать DaoAuthenticationProvider, тогда только Spring Security узнает, что он должен сопоставлять введенные вами учетные данные с учетными данными базы данных для входа в систему.

Затем для этого вам нужно использовать интерфейс UserDetailsService для загрузки пользователя из базы данных, а затем Spring Security сопоставит учетные данные и предоставит доступ.

Упомяните ниже код в своем классе SecurityConfiguration.

@Resource
private UserDetailsService userDetailsService;

@Bean
public DaoAuthenticationProvider authProvider() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(passwordEncoder());
    return authProvider;
}

Затем вам нужно создать UserDetailServiceImpl класс для реализации UserDetailService интерфейса.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Users user1 = userRepository.findByEmail(username);
        if (user1 == null) {
            throw new UsernameNotFoundException(username);
        }

        UserDetails user = User
            .withUsername(user1.getName())
            .password(user1.getPassword())
            .build();

        return user;
    }
}

Это будет работать, если вы используете Spring Data JPA в своем проекте, расширили JpaRepository или CrudRepository с помощью UserRepository и у вас есть метод findByEmail в UserRepository.

Если вам нужна дополнительная информация о том, как использовать Spring Data JPA и как выполнять вход в систему с использованием значений базы данных, прокомментируйте это.

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