AngularJS & Spring 安全 ROLE_ANONYMOUS 仍然 returns 401

AngularJS & Spring Security with ROLE_ANONYMOUS still returns 401

我们正在构建一个 Angular Material 应用程序,使用 RESTful Spring MVC API,具有 Spring 安全性和 OAUTH2。

出于测试目的,我们授予 ROLE_ANONYMOUS 对我们的 /users 端点的访问权限:

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

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

这是我们的 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和AngularJSPOST之间的比较:

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

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

.config(function ($httpProvider) {
    $httpProvider.defaults.headers.put['Content-Type'] = $httpProvider.defaults.headers.post['Content-Type'] =
        'application/json; charset=UTF-8';
});

好的,查看屏幕截图后,我们注意到该方法是 OPTIONS 而不是 POST。

问题不在 headers 中(我们检查了太多以至于没有看到明显的问题),但在 pre-flight 由于 CORS 而导致的请求选项中。这是 nice article about it。我们的 Spring 安全性是为 POST 方法配置的,而不是为 OPTIONS 配置的。我们对其进行了更改,现在它就像一个魅力:

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