Issue
Поэтому я использую Spring boot в качестве бэкенда и React JS в качестве внешнего интерфейса. Моя проблема заключается в том, что я всегда получаю перенаправление на http://localhost:8080/login
, если аутентификация успешна . Это страница входа по умолчанию. В моем классе безопасности у меня настроен настроенный , который будет перенаправлен на http://localhost:8080/authenticated
, если аутентификация успешна и если не пройден , то перенаправить на http://localhost:8080/notauthenticated
. Если я наберу неправильный имя пользователя и пароль, это работает. Он перенаправляет меня на http://localhost:8080/notauthenticated
, но если я набираю правильное имя пользователя и пароль, он всегда перенаправляет меня на http://localhost:8080/login
, но я получаю sessionid, что работает . Если я ввожу неправильные учетные данные, я также получаю идентификатор сеанса, но этот идентификатор сеанса не работает , что имеет смысл. /authenticated
и /notauthenticated
- это всего лишь 2 конечные точки, которые просто возвращают ResponseEntity с типом Boolean. Я также не понимаю, почему это не возвращает истину или ложь. В почтальоне я получаю истину, если я аутентифицирован, но если нет, то он перенаправляет меня на страницу входа по умолчанию.
Код
Spring Security Config Класс:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "OPTIONS", "PUT")
.allowedHeaders("Content-Type", "X-Requested-With", "accept", "Origin", "Access-Control-Request-Method",
"Access-Control-Request-Headers", "Access-Control-Allow-Origin", "Access-Control-Allow-Method", "Set-Cookie")
.exposedHeaders("Access-Control-Allow-Origin", "Access-Control-Allow-Credentials")
.allowCredentials(true).maxAge(3600);
}
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Autowired
UserDetailsServiceImpl userDetailsService;
@Bean
DaoAuthenticationProvider authenticationProvider(){
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
daoAuthenticationProvider.setUserDetailsService(userDetailsService);
return daoAuthenticationProvider;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.antMatchers("/", "index", "/css/*", "/js/*").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().permitAll()
.loginProcessingUrl("/perform_login").permitAll()
.defaultSuccessUrl("/authenticated", true)
.usernameParameter("username")
.passwordParameter("password")
.failureUrl("/notauthenticated")
.and()
.logout()
.logoutUrl("/perform_logout")
.deleteCookies("JSESSIONID")
.and()
.csrf().disable();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider());
}
}
2 конечные точки:
@RequestMapping(value = "/authenticated", method = RequestMethod.GET)
public ResponseEntity<Boolean> authenticate(){
return new ResponseEntity<>(true, HttpStatus.OK);
}
@RequestMapping(value = "/notauthenticated", method = RequestMethod.GET)
public ResponseEntity<Boolean> notAuthenticate(){
return new ResponseEntity<>(false, HttpStatus.OK);
}
Функция отправки в reactjs выглядит следующим образом:
handleSubmit = async e => {
e.preventDefault();
const { username, password } = this.state;
try {
let res = await Axios({
method: 'POST',
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
},
url: "/perform_login",
data: "username=" + username + "&password=" + password
});
let redirectUrl = await res.request.responseURL;
console.log(res);
console.log(redirectUrl);
if(redirectUrl !== 'http://localhost:8080/notauthenticated'){
}
} catch (err) {
console.log(err);
}
};