在单元格编辑上通过jqgrid传递csrf标记

时间:2012-09-07 22:20:14

标签: ajax codeigniter jqgrid parameters csrf

我正在使用Codeigniter和jqgrid来构建应用程序。我最近出于安全原因启用了Codeigniter的内置CSRF保护,并且它破坏了jqgrid的一些东西。我已经能够在jqgrid实例化时传递csrf令牌,所以我的所有数据都加载(通过将csrf令牌添加到postData),但是现在我编辑一个单元格时出现500错误,因为csrf令牌不存在通过。我可以通过每次编辑单元格时查看发布数据来验证这一点。我读了几个地方,editData是我想要的,但在那里添加令牌似乎没有在编辑ajax请求中传递它。有什么想法吗?

$("#cust_grid").jqGrid({
    url:'/ajax/grid',
    datatype: 'xml',
    mtype: 'POST',              
    postData: {<?php echo $this->security->get_csrf_token_name().":'".$this->security->get_csrf_hash()."'"; ?>},
    editData: {<?php echo $this->security->get_csrf_token_name().":'".$this->security->get_csrf_hash()."'"; ?>},
    colNames:['Name1', 'Name2'],
    colModel :[ 
        {name:'name1', index:'name1', width:55, search: true},
        {name:'name2', index:'name2', width:110, search: true},
                        ],
    pager: '#pager',
    rowNum:25,
    rowList:[10,25,50,100],
    sortname: 'name1',
    sortorder: 'asc',
    viewrecords: true,
    gridview: true,
    caption: 'Customers',
    height: 600,
    width: 1200,
    shrinkToFit: false,
    altRows: true,
    cellEdit: true,     
    cellsubmit: "remote",
    cellurl: "/ajax/editCell",
},
{}
);

3 个答案:

答案 0 :(得分:0)

似乎你可以像我描述here一样解决问题。主要区别在于您使用cell editing而不是form editing。因此,您应该使用ajaxCellOptions代替ajaxEditOptions

ajaxCellOptions: {
    loadBeforeSend: function(jqXHR) {
        // you should modify the next line to get the CSRF tocken
        // in any way (for example $('meta[name=csrf]').attr('content')
        // if you have <meta name="csrf" content="abcdefjklmnopqrstuvwxyz="/>)
        var csrf_token = '<%= token_value %>'; // any way to get
        jqXHR.setRequestHeader('X-CSRF-Token', csrf_token);
    }
}

答案 1 :(得分:0)

我最终找到了问题的另一种解决方案。我正在调查另一个答案中发布的单元格编辑链接,我看到了beforeSubmitCell选项。如果从该函数返回json数据,则每次编辑单元格时都会将其附加到post数据。所以我需要做的就是添加一个选项:

beforeSubmitCell: function (rowid,celname,value,iRow,iCol) {
  return {<?php echo $this->security->get_csrf_token_name().":'".$this->security->get_csrf_hash()."'";?>} 
},

答案 2 :(得分:0)

我尝试后没有回答问题。然后我找到了将CSRF Token从Jqgrid内联编辑传递到Django的解决方案:

onSelectRow: function(id){
   if(id && id!==lastSel){ 
      $(selector).restoreRow(lastSel); 
      lastSel=id; 
   }

 var editparameters = {
    extraparam: {csrfmiddlewaretoken: $('.token-data').data('token')},
    keys: true,
  };
 $(selector).jqGrid('editRow', id, editparameters);
}

用法示例: http://yodi.polatic.me/jqgrid-inline-editing-integration-with-django-send-csrf-token/