AngularJS&使用ROLE_ANONYMOUS的Spring Security仍然返回401

时间:2015-04-28 17:50:33

标签: angularjs spring-mvc spring-security cors spring-security-oauth2

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

出于测试目的,我们为我们的/用户端点提供了ROLE_ANONYMOUS访问权限:

<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之间的比较:

screenshot

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

我们尝试在AngularJS的POST请求中放置自定义标头,但它似乎不起作用:

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

1 个答案:

答案 0 :(得分:3)

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

问题不在标题中(我们检查的那些太多,以至于我们没有看到明显的),但是在飞行前请求OPTIONS由于CORS。这是一个nice article about it。我们的Spring Security是为POST方法配置的,但不是为OPTIONS配置的。我们改变了它,现在它就像一个魅力:

$sMotif = "/--$sIN ([a-zA-Z0-9]{3,4},)*([a-zA-Z0-9]{3,4}){1}/i";
if ((preg_match("$sMotif ",$this->sParam))||(eregi("$sMotif$",$this->sParam))){
    $this->aParam['bExtension'] = TRUE;
    $this->aParam['aExtension'] = $this->_PARAM_get_extension($sIN);
    $this->aParam['inExtension'] = ($sIN=='e');
    $this->aParam['iParameters']++;
}