Sharepoint 2007 使用SPServices阻止UpdateListItems正常运行的权限
我已经编写了签入/签出列表项的代码。它可以很好地与管理员配合使用,但任何其他权限级别都会遇到问题,即该站点的“\u vti\u bin/lists.asmx”上的UpdateListItems出现401未经授权的错误。我已经确认用户可以查看“\u vti\u bin/lists.asmx”web服务Sharepoint 2007 使用SPServices阻止UpdateListItems正常运行的权限,sharepoint-2007,Sharepoint 2007,我已经编写了签入/签出列表项的代码。它可以很好地与管理员配合使用,但任何其他权限级别都会遇到问题,即该站点的“\u vti\u bin/lists.asmx”上的UpdateListItems出现401未经授权的错误。我已经确认用户可以查看“\u vti\u bin/lists.asmx”web服务 //declare variables used for check-in/check-out. var varName; var varChecked; var varID
//declare variables used for check-in/check-out.
var varName;
var varChecked;
var varID
var varQueryStringVals;
//Check who has checked out the item
function getCheckOutPerson (){
$().SPServices({
operation: "GetListItems",
async: false,
listName: "Communications Services Request Form",
CAMLQuery: "<Query><Where><Eq><FieldRef Name='ID' /><Value Type='Number'>" + varID + "</Value></Eq></Where></Query>",
completefunc: function (xData, Status) {
$(xData.responseXML).SPFilterNode("z:row").each(function() {
varChecked = $(this).attr("ows_CheckedOutTo");
});
}
});
};
$(document).ready(function() {
//Check-in if edits cancelled
$("#cancelBtn").click(function(){
//Check in edited item.
if (varName == varChecked){
$().SPServices({
operation: "UpdateListItems",
async: false,
debug: true,
listName: "Communications Services Request Form",
ID: varID,
valuepairs: [["CheckedOutTo", ""]],
completefunc: function(xData, Status) {}
});
};
});
//get current user
varName = $().SPServices.SPGetCurrentUser({
fieldName: "Title",
debug: false
});
//get current list item ID
varQueryStringVals = $().SPServices.SPGetQueryString();
varID = varQueryStringVals["ID"];
//get checked out name
getCheckOutPerson();
// item checked in or checked out by current user?
if (varChecked == undefined || varName == varChecked){
//check out item
$().SPServices({
operation: "UpdateListItems",
async: false,
debug: true,
listName: "Communications Services Request Form",
ID: varID,
valuepairs: [["CheckedOutTo", varName]],
completefunc: function(xData, Status) {
}
});
};
//checked out message
if (varChecked != undefined && varName != varChecked) {
alert ("You cannot edit this item. It is check out by " + varChecked +".");
history.back();
};
//Display 'checked out to' in dispitem.aspx
getCheckOutPerson();
if ($('.CheckedOut').text('')) {
$('.CheckedOut').append(varChecked);
}
});
function PreSaveAction() {
if (varName != varChecked){
alert ("You cannot make changes to this item. It it checked out to " + varChecked);
return false;
};
//Check in edited item.
$().SPServices({
operation: "UpdateListItems",
async: false,
debug: true,
listName: "Communications Services Request Form",
ID: varID,
valuepairs: [["CheckedOutTo", ""]],
completefunc: function(xData, Status) {}
});
return true;
};
//声明用于签入/签出的变量。
var varName;
var varChecked;
变量
var varQueryStringVals;
//检查谁已签出该项目
函数getCheckOutPerson(){
$().SPServices({
操作:“GetListItems”,
async:false,
列表名称:“通信服务请求表”,
CAMLQuery:“+varID+”,
completefunc:函数(扩展数据、状态){
$(扩展数据.responseXML).SPFilterNode(“z:row”).each(函数(){
varChecked=$(this.attr(“ows_CheckedOutTo”);
});
}
});
};
$(文档).ready(函数(){
//如果编辑被取消,请签入
$(“#取消BTN”)。单击(函数(){
//签入已编辑的项目。
if(varName==varChecked){
$().SPServices({
操作:“UpdateListItems”,
async:false,
是的,
列表名称:“通信服务请求表”,
ID:varID,
valuepairs:[[“CheckedOutTo”,“”]],
completefunc:函数(扩展数据,状态){}
});
};
});
//获取当前用户
varName=$().SPServices.SPGetCurrentUser({
字段名:“标题”,
调试:false
});
//获取当前列表项ID
varQueryStringVals=$().SPServices.SPGetQueryString();
varID=varQueryStringVals[“ID”];
//签出名称
getCheckOutPerson();
//项目是否由当前用户签入或签出?
if(varChecked==未定义| | varName==varChecked){
//签出项目
$().SPServices({
操作:“UpdateListItems”,
async:false,
是的,
列表名称:“通信服务请求表”,
ID:varID,
valuepairs:[[“CheckedOutTo”,varName]],
completefunc:函数(扩展数据、状态){
}
});
};
//签出消息
if(varChecked!=未定义&&varName!=varChecked){
警报(“您无法编辑此项目。它由“+varChecked+”签出”);
历史。返回();
};
//在dispitem.aspx中显示“签出到”
getCheckOutPerson();
如果($('.CheckedOut')。文本(''){
$('.CheckedOut').append(varChecked);
}
});
函数PreSaveAction(){
if(varName!=varChecked){
警报(“您无法对此项进行更改。它已签出为“+varChecked”);
返回false;
};
//签入已编辑的项目。
$().SPServices({
操作:“UpdateListItems”,
async:false,
是的,
列表名称:“通信服务请求表”,
ID:varID,
valuepairs:[[“CheckedOutTo”,“”]],
completefunc:函数(扩展数据,状态){}
});
返回true;
};
非管理员用户是否有足够的权限?对于签出/签入,只读是不够的
您是否正在使用项目级权限?
我能够使用lists.asmx UndoCheckOut获得一个工作示例。测试通过了一个具有admin/owner的用户和另一个仅具有contribution的用户。docUrl必须是项目的完整url(例如-)。注意,标题中的SOAPAction(参见Jan Tielen-)
函数撤消签出(docUrl){
var soapEnv=
" \
\
\
\
“+docUrl+”\
\
\
";
$.ajax({
url:“http://server/mysite/_vti_bin/lists.asmx",
类型:“POST”,
数据类型:“xml”,
数据:soapEnv,
contentType:“text/xml;字符集=\“utf-8\”,
发送前:函数(xhr){
setRequestHeader(“SOAPAction”,
"http://schemas.microsoft.com/sharepoint/soap/UndoCheckOut");
},
完成:功能(扩展数据、状态){
var result=$(xData.responseXML.find(“UndoCheckOutResult”).text();
如果(结果==“true”)警报(“撤消签出成功”);
},
错误:函数(){
警报(“错误”);
}
});
}
结果表明,这与我在那里发布的任何内容无关。权限层次结构混乱,因此当我尝试在列表级别为用户提供贡献权限时,会向用户提供更高站点的读取权限,而忽略列表级别的权限。用户有贡献权限,但我也尝试了完全访问权限,但仍会出现401未经授权的错误。此外,我在UpdateListItems调用中使用了ID,参与者级别的帐户获得了正确的ID。是的,结果是权限混乱,用户没有使用远程API的权限。这就是造成问题的原因。
function UndoCheckout(docUrl){
var soapEnv =
"<?xml version='1.0' encoding='utf-8'?> \
<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> \
<soap:Body> \
<UndoCheckOut xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
<pageUrl>"+ docUrl +"</pageUrl> \
</UndoCheckOut> \
</soap:Body> \
</soap:Envelope>";
$.ajax({
url: "http://server/mysite/_vti_bin/lists.asmx",
type: "POST",
dataType: "xml",
data: soapEnv,
contentType: "text/xml; charset=\"utf-8\"",
beforeSend: function(xhr) {
xhr.setRequestHeader("SOAPAction",
"http://schemas.microsoft.com/sharepoint/soap/UndoCheckOut");
},
complete: function(xData, status){
var result = $(xData.responseXML).find("UndoCheckOutResult").text();
if (result == "true") alert("Undo checkout succeeded.");
},
error: function(){
alert("error");
}
});
}