2012-09-07 34 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/