Я разработал простую загрузку Spring и безопасность Spring для входа в форму с конфигурацией ниже.
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/resources/**", "/registration").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
http.csrf().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
}
Я также создал пользовательскую реализацию userDetailsService, чтобы получить пользователя.
Теперь, когда я вхожу в систему с веб-страницы с помощью формы входа, я могу успешно войти в систему и получить доступ к защищенным конечным точкам (я также могу видеть JSESSIONID в последующем ответе.
Но когда я пытаюсь войти в систему через другую службу (приложение для Android), используя httpPost с url: http: // localhost: 9090 / логин, я вижу, что пользователь аутентифицирован.
Но тогда я не могу получить доступ к защищенным конечным точкам из приложения для Android. Ответ возвращает строку HTML (данные страницы входа).
Я тоже не вижу в ответе JSESSIONID.
В целом моя конфигурация работает нормально для веб-страниц, но не может заставить ее работать с другими API.





Это работает, когда вы используете форму входа на веб-страницу, потому что ваш пользовательский интерфейс и сервер находятся в одном домене. Когда Spring Security аутентифицирует пользователя, я считаю, что он добавляет идентификатор сеанса в заголовок cookie, чтобы он мог аутентифицировать каждый запрос после входа в систему. При обращении к вашему Spring API из другого домена, в данном случае вашего Android-приложения, оно больше не находится в том же домене, поэтому Spring Security не будет добавлять идентификатор сеанса в заголовок cookie. Итак, чтобы делать то, что вы хотите, я считаю, вам нужно написать свой собственный фильтр аутентификации, чтобы добавить файл cookie или заголовок к запросу. Вот ссылка, в которой используются веб-токены JSON для аутентификации API с помощью весенней загрузки. https://auth0.com/blog/implementing-jwt-authentication-on-spring-boot/