当没有定义 CSRF 时,Angular $resource 查询在 PUT 上获得 401,在定义 CSRF 时在 GET 上获得 404:/
Posted
技术标签:
【中文标题】当没有定义 CSRF 时,Angular $resource 查询在 PUT 上获得 401,在定义 CSRF 时在 GET 上获得 404:/【英文标题】:Angular $resource query gets a 401 on PUT when no CSRF is defined and a 404 on GET when CSRF is defined :/ 【发布时间】:2013-12-10 14:34:20 【问题描述】:我目前遇到更新列表问题。 我使用 Rails 和 AngularJS。
在 JS 方面,我使用 Angular $resource 功能插入 jQueryUI 以实现可排序功能,以读取、更新(并在第二步中删除和创建)已排序的文本块。
例如。
“1 - lorem ipsum”
“2 - 第二位置 lorem ipsum”
“3 - 第三个位置”
在 AngularJS 控制器中我有这个:
function DndCtrl($scope, $resource)
var Feed = $resource('/users/'+ userId +'/test/:id', id: '@id', 'update': method:"PUT", isArray:true);
$scope.tests = Feed.query(function()
$scope.updateSortable =
// jQueryUI methods
update: function(e, ui)
// trigger after user ends dropping item
for (var i=0; i<$scope.tests.length; i++)
var t = $scope.tests[i];
t.position = i+1;
t.$update();
,
placeholder: "t-hightlight",
axis: 'y'
;
);
// end DnD
排序后的输出:
PUT http://demo.mytest.dev/users/1/test/1 401 (Unauthorized)
并在服务器日志中:
warning can't verify csrf
于是我在这个话题上找到了:Rails CSRF Protection + Angular.js: protect_from_forgery makes me to log out on POST HuangYuHei 的答案并尝试了一下。
然后控制台输出:
GET http://demo.mytest.dev/users/1/test 404 (Not Found)
在服务器日志上:
Test Load (1.9ms) SELECT "tests".* FROM "tests" WHERE "tests"."id" = 2 LIMIT 1
Unpermitted parameters: id
我直接在rails控制台中测试了请求,它很好地返回了条目。
我做错了什么?我错过了 Rails 配置部分的内容吗?还是在 Angular 部分?
【问题讨论】:
【参考方案1】:您在 Rails 控制器操作中遇到了strong_params 问题。
strong_params
是 Rails 4 中的新功能,它取代了之前版本中的 attr_accessible
模型属性。您现在在控制器中指定允许在查询中使用来自 params
的哪些字段。
它应该看起来像这样:
respond_with Test.find(params.permit(:id))
# or
render json: Test.find(params.permit(:id))
【讨论】:
哦,谢谢,我觉得我们已经接近解决方案了!!我尝试了您的两种解决方案+在模型中添加了 attr_accessible 。错误输出在 500 状态下发生变化,并带有“参数错误(未知:id)”关于我应该深入挖掘什么的任何想法? 经过一些调查,我有这种行为:角度进行了 $update,Rails 很好地保存在数据库中。一切都很好但是,在前端,控制台返回错误 500。我怎样才能避免显示,因为更新运行良好? 这是 rails 给出的响应,产生了这个错误。在 Rails 上,更新时,我们只需要执行 save() 并渲染页面。 :) 感谢您的指出以上是关于当没有定义 CSRF 时,Angular $resource 查询在 PUT 上获得 401,在定义 CSRF 时在 GET 上获得 404:/的主要内容,如果未能解决你的问题,请参考以下文章
Cookie 中的 Angular JWT 如何防止 CSRF/XSRF 和 XSS
使用 CSRF_COOKIE_HTTPONLY 将 Django CSRF 令牌传递给 Angular