2012-09-07 27 views
0

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

$("#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", 
}, 
{} 
); 
+0

实际上,它看起来像我的问题很相似,这[一](HTTP ://stackoverflow.com/questions/10511521/codeigniter-with-jqgrid-use-csrf-token?rq = 1) 但那一个没有答案:( – Erreth

回答

0

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

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

我试过这种方法,它没有工作。但是,在看过您发布的单元格编辑链接后,我想出了另一种方法来完成它。谢谢!请参阅下面的答案。 – Erreth

0

我试过后没有答案。然后我找到了解决办法从jqGrid的内联编辑通过CSRF令牌来的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/