Angular2身份验证失败,401

时间:2016-08-13 09:19:59

标签: spring spring-mvc authentication angular http-status-code-401

我正在使用Spring-MVC构建一个Angular2应用程序。我在Spring Security中添加了身份验证,当我用邮递员查询我的REST服务器时,一切都很好。当我在Angular2中将Authorization添加到我的标题时,我收到401错误。

错误:     No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 401

我的Angular2服务:

@Injectable()
export class BookService {
  headers = new Headers();
  options = new RequestOptions({ headers: this.headers });

  constructor(
    private http: Http) {
      this.headers.append('Content-Type', 'application/json');
      this.headers.append('Authorization', 'Basic ' + btoa('nirgn:password'));
  }

  getBooksByCategory(categoryId: number) {
    return this.http.get(environment.baseUrl + 'categories/' + categoryId + '/books', this.options)
      .map((res: Response) => <Book[]>res.json()._embedded.books)
      .catch(this.handleError);
  }
}

在春天,我允许这样的所有来源:response.addHeader("Access-Control-Allow-Origin", "*");(在CORSFilter implements Filter类中)。

另外,我添加了这样的身份验证:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic().and().authorizeRequests().anyRequest().authenticated();
}

当我删除.and().authorizeRequests().anyRequest().authenticated()时,我没有收到任何错误,并且能够GET来自服务器的数据。

所以,总而言之,我很确定它不是Access-Control-Allow-Origin而且是因为服务器没有得到我的授权标头。当我尝试在postman中查询服务器时,没有auth我也得到401,但是当我添加Basic auth时我得到200.

我还检查邮递员和angualr2中密码的输出,以确保angualr2输出中'Basic ' + btoa('nirgn:password')输出的密码与邮递员相同,并且它是相同的。这里是: enter image description here

1 个答案:

答案 0 :(得分:1)

所以我设法搞清楚了。毕竟这是CORS(春天)。

我必须告诉我的configure班级使用我创建的CORSFilter

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic().and().authorizeRequests().anyRequest().authenticated()
        .and().addFilterAfter(new CORSFilter(), CsrfFilter.class);
}

奇怪的是,我仍然不明白为什么邮递员成功并且在浏览器中(有角度)我得到了错误。