Я пытаюсь защитить мою конечную точку 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});
}
}
Я ценю любую помощь, которая привела меня к ответу.