Spring Security всегда перенаправляет меня на страницу входа по умолчанию - PullRequest
0 голосов
/ 06 января 2020

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);
    }
  };

1 Ответ

0 голосов
/ 21 января 2020

У меня возникла та же проблема, и я решил добавить эту аннотацию в мой класс SpringWebApplication, это указывает Spring для удаления конфигурации по умолчанию

@ComponentScan( { "it.myapplication.controllers" } )
@EnableCaching
@SpringBootApplication( exclude = { SecurityAutoConfiguration.class } )
public class MyWebApplication{
    public static void main( String[] args ){
        SpringApplication.run( MyWebApplication.class, args );
    }
}

В моем классе WebSecurityConfig я ничего не изменил

public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure( HttpSecurity http ) throws Exception
    {

    http
            .authorizeRequests()
            .antMatchers( "/","/home") 
            .permitAll() 
            .anyRequest()
            .authenticated().and()
            .formLogin().loginPage( "/login" )
            .permitAll().and().logout().permitAll();
    }

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

 <body>
    <div th:if="${param.error}">
        Invalid username and password.
    </div>
    <div th:if="${param.logout}">
        You have been logged out.
    </div>
    <form th:action="@{/login}" method="post">
        <div><label> User Name : <input type="text" name="username"/> </label></div>
        <div><label> Password: <input type="password" name="password"/> </label></div>
        <div><input type="submit" value="Sign In"/></div>
    </form>
</body>

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...