Настройте Spring Security CSRF TOKEN с Angular2 + - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь защитить мою конечную точку REST с помощью пружинной защиты и использовать ее с угловым + 2 внешним интерфейсом.

я знаю, что CSRF TOKEN генерируется, когда пользователь вошел в систему, и этот токен должен быть отправленс каждой формой отправки (запрос POST), но моя проблема, я не могу получить этот токен из бэкэнда, чтобы использовать его в forntend.

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

вот мой код:

SecurityConfig

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public UserDetailsService addUsers() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("Ali")
                .password("mind@123")
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(user);
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        final CorsConfiguration configuration = new CorsConfiguration();

        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowCredentials(true);
        configuration.setAllowedHeaders(Arrays.asList("*"));
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // TODO Auto-generated method stub

        http.
        authorizeRequests()
        .antMatchers("**")
        .authenticated()
        .and().httpBasic();
        http
            .cors().and()
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and()
            .addFilterAfter(new CustomeCSRF(),CsrfFilter.class);
    }

    private CsrfTokenRepository csrfTokenRepository() {
        HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
        repository.setHeaderName("XSRF-TOKEN");
        return repository;
    }
}

CustomeCSRF

public class CustomeCSRF extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName());

        if (csrf != null) {

            Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
            String token = csrf.getToken();

            if (cookie == null || token != null && !token.equals(cookie.getValue())) {
                cookie = new Cookie("XSRF-TOKEN", token);
                cookie.setPath("/");
                response.addCookie(cookie);
                //response.setHeader("XSRF-TOKEN", token);
            }
        }

        filterChain.doFilter(request, response);

    }

}

это мой ответ Заголовок из браузера

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:4200
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 0
Date: Sat, 19 Oct 2019 12:36:55 GMT
Expires: 0
Pragma: no-cache
Vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
WWW-Authenticate: Basic realm="Realm"
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

frontend

export class UserService  {

  // Headers Config
  header = new HttpHeaders({'Content-Type':'application/text  '});

  CSRF-TOKEN = '';

  constructor(private http:HttpClient,private tokenExtractor: HttpXsrfTokenExtractor) { 
    console.log('constractor of service')
    //console.log(this.header);
    this.header = this.header.set('Authorization', 'Basic ' + btoa( 'Ali'+':'+'mind@123'));
    //this.header = this.header.set('withCredentials',' true'); //{:}
    //this.header = this.header.set('Content-Type','text/plain');
    //console.log(this.header);
  }
  createUser(){
    let user = new User();
    user.id = 100;
    user.name = "ALI Angular"
    user.phone = "90234809284092834";
    return this.http.post('http://localhost:8080/api/addUser',user,{headers:this.header});
  }
}

Я ценю любую помощь, которая привела меня к ответу.

...