Я новичок в 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();
}
}
Если вы используете учетные данные пользователя из базы данных для входа в систему, вам нужно использовать 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 и как выполнять вход в систему с использованием значений базы данных, прокомментируйте это.
прочитайте свои журналы отладки, и, пожалуйста, сделайте это, прежде чем спрашивать здесь.