Spring Boot Authorization возвращает ошибку 401? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть проблема, что, когда я успешно вошли в систему, я хочу, чтобы сделать запрос, чтобы получить информацию о пользователе. запрос я посылаю это запрос обеспеченного GET, который https://localhost:8080/users/userOne этот запрос отправить мой угловым фронтэндом.

1003 * Но моя проблема сейчас, весна Загрузочный говорят мне о том, что пользователь не имеет право и отправки 401 ошибки. Я отправляю токен авторизации, когда делаю запрос от внешнего интерфейса к внутреннему. В моем коде ниже вы можете видеть, что я делаю.

Служба Angular :

  getUserDetails(username) {
    const headers = new HttpHeaders().append('Authorization', this.cookieService.get('token')).append('Content-Type', 'application/json');
    return this.http.get(`http://localhost:8080/users/` + username, { headers }).pipe(
      map(
        userData => {
          console.log(userData);
          return userData;
        }
      ));
  }

Мой UserController:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @CrossOrigin(origins = "http://localhost:4200/", maxAge = 3600)
    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public ResponseEntity<User> getUserByUsername (@RequestBody String username){
        final User user = userService.getUserByUsername(username);
        return ResponseEntity.ok(user);
    }
}

My WebSecurityConfig

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().authorizeRequests()
                .antMatchers(HttpMethod.POST,"/authenticate").permitAll()
                .anyRequest().authenticated().and()
                .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and().formLogin().disable();
        http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

Мой фильтр

@Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException {
        res.setHeader("Access-Control-Allow-Origin", "*");
        res.setHeader("Access-Control-Allow-Credentials", "true");
        res.setHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,PATCH,OPTIONS");
        res.setHeader("Access-Control-Allow-Headers", "Authorization, Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");

        if ("OPTIONS".equalsIgnoreCase(req.getMethod())) {
            res.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

Запрос аутентификации в Angular:

authenticate(username, password) {
      const headers = new HttpHeaders({
        'Content-Type': 'application/json',
        Authorization: sessionStorage.getItem('token'),
      });
      return this.httpClient.post<any>('http://localhost:8080/authenticate', {username, password}).pipe(
       map(
         userData => {
          sessionStorage.setItem('username', username);
          sessionStorage.setItem('token', userData.token);
          this.isLoggedIn = true;
          return userData;
         }
       )
      );
    }

Ошибка, которую я получаю:

GET http://localhost:8080/users/userOne 401
ERROR HttpErrorResponse {headers: HttpHeaders, status: 401, statusText: "OK", url: "http://localhost:8080/users/Bogatom", ok: false, …}

Я не знаю, что я делаю неправильно ...

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Во-первых, попробуйте отправить запрос GET с помощью приложения 3-й партии, как почтальона или ARC. Если это работает, то вы будете знать, что маркер не будет добавлен правильно в угловой. Но если это не сработало, проблема может быть в весенней конфигурации безопасности. В этом случае, для целей тестирования, позволяют все запросы на «/ пользователей» путь, и посмотреть, что вы получите, а затем добавить:

.antMatchers(HttpMethod.GET,"/users/**")
            .hasAuthority(authirty_name)

пользователям разрешения, чтобы получитьэтот ресурс.

0 голосов
/ 11 ноября 2019

Сначала необходимо выполнить вызов POST по номеру http://localhost:8080/login, указав следующие заголовки этого запроса:

headers = { "Content-Type": "application/x-www-form-urlencoded", "X-XSRF-TOKEN": csrf_token }

и учетные данные, закодированные с использованием urlencode в теле запроса

credentials = { 'username': username, 'password': password }

Ответ на этот запрос будет содержать такие элементы, как 'X-XSRF-TOKEN' и / или JSESSIONID, которые необходимо передать при выполнении всех последующих запросов к http://localhost:8080/users или любому другомуURL, который авторизован. Надеюсь, это поможет.

...