带有ROLE_ANONYMOUS的AngularJS和Spring Security仍返回401

我们正在构建一个Angular Material应用程序,并使用RESTful Spring MVC API和Spring Security& OAuth2用户.

为了进行测试,我们为ROLE_ANONYMOUS授予了/ users端点的访问权限:

<intercept-url pattern="/users" method="POST" access="ROLE_ANONYMOUS"/>

但是,当我们尝试通过POST发送JSON时,仍会从服务器收到401响应.

>对于诸如Postman之类的非语言客户端,则不会发生这种情况.
>如果禁用Spring Security过滤器,则一切正常.
> GET请求到同一端点也可以正常工作.

这是我们的app.config:

  angular.module('App')
    .constant('RESOURCES', (function () {
                var resource = 'http://localhost:8080';
                return {
                  USERS: resource + '/users'
                }
              })());

而工厂正在执行POST方法:

  app.factory('LoginUser', ['RESOURCES', '$resource', function (RESOURCES, $resource) {
    return $resource(RESOURCES.USERS, null, {
                       add: {method: 'POST'}
                     });
  }]);

以及控制器中的注册方法:

  function signup(user) {
    LoginUser.add({}, JSON.stringify(user));
  }

Spring guide之后,我们在服务器中具有SimpleCORSFilter设置.

您可以在此处查看邮递员POST和AngularJS POST之间的比较:

以红色标记的标头是自定义标头,我们必须在Postman中添加标头,以避免415不支持的媒体类型.

我们试图将自定义标头放入AngularJS的POST请求中,但似乎不起作用:

.config(function ($httpProvider) {
    $httpProvider.defaults.headers.put['Content-Type'] = $httpProvider.defaults.headers.post['Content-Type'] =
        'application/json; charset=UTF-8';
});
最佳答案
好的,在查看了屏幕截图之后,我们注意到该方法是OPTIONS而不是POST.

问题不在于标题(我们检查了很多东西以至于我们看不到明显的东西),而是由于CORS而在飞行前请求OPTIONS.这是一个nice article about it.我们的Spring Security是为POST方法配置的,但没有为OPTIONS配置的.我们对其进行了更改,现在它就像一种魅力:

  <intercept-url pattern="/users" method="POST" access="ROLE_ANONYMOUS"/>
  <intercept-url pattern="/users" method="OPTIONS" access="ROLE_ANONYMOUS"/>

转载注明原文:带有ROLE_ANONYMOUS的AngularJS和Spring Security仍返回401 - 代码日志