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 响应。
- 像 Postman 这样的 non-angular 客户端不会发生这种情况。
- 如果我们禁用 Spring 安全过滤器,一切正常。
- 对同一端点的 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和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"/>
我们正在构建一个 Angular Material 应用程序,使用 RESTful Spring MVC API,具有 Spring 安全性和 OAUTH2。
出于测试目的,我们授予 ROLE_ANONYMOUS 对我们的 /users 端点的访问权限:
<intercept-url pattern="/users" method="POST" access="ROLE_ANONYMOUS"/>
但是当我们尝试通过 POST 发送 JSON 时,我们仍然从服务器收到 401 响应。
- 像 Postman 这样的 non-angular 客户端不会发生这种情况。
- 如果我们禁用 Spring 安全过滤器,一切正常。
- 对同一端点的 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和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"/>