Spring Security无法看到Angular传递的凭据

时间:2019-05-14 16:30:47

标签: angular spring-security authorization

我尝试使用Spring Security基本授权。当我从角度发出发布请求时,spring无法识别“用户名”和“密码”属性。当我向邮递员发出发帖请求时,它起作用了。我不知道问题出在弹簧配置还是角度要求。

我已经尝试了多种发布请求配置,但没有任何效果。

这是我的春季安全配置:

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("a").password("a").roles("*");
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().
                csrf().disable()
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS,"/**").permitAll()
                .antMatchers("/login").permitAll()
                .antMatchers("/users").permitAll()
                .anyRequest().authenticated()
                .and().formLogin().and().httpBasic();
    }

我最新的角度发布请求:

constructor(private httpClient: HttpClient) {}

  handleLogin(user: UserDto) {

    let headers = new HttpHeaders({
      'Authorization': 'Basic ' + btoa('a' + ':' + 'a'),
       'X-Requested-With': 'XMLHttpRequest'
});
    this.httpClient
      .post("//localhost:8080/login" ,{}, {headers}).subscribe(x=> {console.log(x)});
  }

这是Spring安全检查凭证和结果为空的地方

public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        if (this.postOnly && !request.getMethod().equals("POST")) {
            throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
        } else {
            String username = this.obtainUsername(request); //null
            String password = this.obtainPassword(request); //null

当我从邮递员授权工作中发出发帖请求时,我希望有人可以帮助我解决与角度请求有关的seme结果。

-----------编辑---------- 如评论中所建议,我尝试了这个并且仍然是同样的问题。

let options = { headers: headers };
this.httpClient
  .post("//localhost:8080/login", {}, options).subscribe(x => { console.log(x) });

谢谢

1 个答案:

答案 0 :(得分:0)

对于HttpClient.post,第二个参数应该是请求正文,然后是选项。

也许添加

let options = { headers: headers };
this.httpClient.post(url, null, options);

https://v4.angular.io/api/common/http/HttpClient#post

Angular的4.3之前版本具有一个旧的http api,其中包含一组不同的参数,可能会使您感到困惑。