проблема с подключением Angular 10 с безопасностью Spring для использования пользовательской страницы входа

Я работаю над веб-приложением, используя Spring boot и Spring Security с внешним интерфейсом, контролируемым angular 10. Я реализовал бэкэнд для безопасности и также создал страницу входа. Но при запуске на локальном хосте выдает ошибку

заблокировано политикой CORS: ответ на предварительный запрос не проходит проверку управления доступом: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».

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

Контроллер

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    AuthenticationManager authenticationManager;

    @PostMapping("/login")
    public boolean login(@RequestBody loginDetails data) {
        try {
            String username = data.getUsername();
            System.out.println("Checking...");
            System.out.println(data.getUsername());
            System.out.println(data.getPassword());
            authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, data.getPassword()));
            // String token = jwtTokenProvider.createToken(username,
            // this.users.findByEmail(username).getRoles());
            System.out.println("abcdefg");
            Map<Object, Object> model = new HashMap<>();
            model.put("username", username);
            // model.put("token", token);
            /* return true; */
        } catch (AuthenticationException e) {
            /*
             * throw new BadCredentialsException("Invalid email/password supplied");
             */
            return false;
        }
        return true;
    }

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

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Qualifier("userDetailsService")
    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {

        return new BCryptPasswordEncoder();
    }

    
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/user/save","/user/login",    
                "/admin/**").permitAll().anyRequest().authenticated().and().csrf()
                .disable().formLogin().permitAll().and().logout().permitAll();
        http.cors();
    }
     
    @Bean
    public AuthenticationManager customAuthenticationManager() throws Exception {
        return authenticationManager();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
    }

}

Код AngularRequest

public doLogin(){

      this.userLogin.username=this.loginForm.get("username").value;
      this.userLogin.password=this.loginForm.get("password").value;
      console.log(this.userLogin);
    return this.http.post<any>("http://localhost:8080/user/login",this.userLogin).subscribe((response) => {
    
              if (response.status === 200) {
                  
                console.log('login successfully');
    
              } else {
    
                console.log('galat');
    
              }
  
            }
        );
  }

person Sarthak    schedule 29.09.2020    source источник


Ответы (1)


Прежде всего, попробуйте изменить на:

@Override
protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().cors().and()
        .authorizeRequests().antMatchers("/user/save", "/user/login",
                "/admin/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().permitAll()
                .and().logout().permitAll();
    }

CORS это проверка браузера, если у вас есть ответ: Access-Control-Allow-Origin: http://localhost:4200 или нет: No 'Access-Control-Allow-Origin' header is present on the requested resource.; Измените http://localhost:4200 на URL-адрес внешнего интерфейса; И добавьте в свой WebSecurityConfig:

@Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:4200")
                .allowedMethods("*");
    }
and: implements WebMvcConfigurer

Ответ без ошибок: Ответ без ошибок:

Ответ с ошибкой. Нет Access-Control-Allow-Origin: Ответ с ошибкой. Нет Access-Control-Allow-Origin:

person mzhehalo    schedule 29.09.2020