我谷歌搜索了很长一段时间,但找不到答案。这是一个问题:
是否可以管理列表的用户权限 部署到应用程序网络?
我们有很多可能在主机网站(父网站)上执行此操作,我们可以在其中为任何用户定义权限。在应用程序Web(SharePoint应用程序域)上,我们可以直接访问所有已部署的列表,并且无法为某些特定用户设置权限。我有不同的用户组,我希望他们对应用程序Web上部署的列表具有不同的权限。我怎么能这样做,或者甚至可能呢?
如果没有,当任何应用用户可以直接访问这些列表并更改数据时,这些列表可用于什么?
答案 0 :(得分:4)
我将使用加载项术语而不是应用,因为这是Microsoft calls them now。
答案是否定的。您无法在开发期间为SharePoint托管的加载项指定用户或组权限
原因很简单:加载项Web与SharePoint场的其余部分隔离,并且可以安装在服务器场中的任何位置。考虑到用户和组的范围限定为网站集级别,如果在多个网站集中安装加载项,则无法说明该网站集中有哪些用户和组可用。
此外,如果您在SharePoint Store中发布加载项,则加载项不会知道安装它的环境,因此无法确定哪些用户或组可以访问添加的内容 - 在网上。
答案是肯定的。安装应用程序后,您可以在加载项Web中指定列表权限和项目权限,就像在主机Web中一样。
默认情况下,加载项Web中的所有列表都会从主机Web继承权限,因为加载项Web本身会从主机Web继承权限。因此,您需要成为主机Web上的网站集管理员或网站所有者才能破坏继承和更改加载项Web中列表的权限。
您可以在主机网络中创建群组,然后在您的插件网络中使用这些群组,就像您在主机网络中的列表一样。 SharePoint组提供了更好的权限管理,即当新用户/员工需要列表权限时,您只需将该用户添加到网站集中任何位置都可访问的组,而不是直接将其添加到加载项Web中的列表中
您可以使用以提升的权限运行的SharePoint 2013工作流设置加载项Web上的列表项的权限(请参阅assign permissions to lists活动)并进行AppOnlySequence调用以更改列表项权限。
使用Visual Studio开发和调试/安装加载项时,请确保在更改列表权限后不要停止调试,因为如果停止并重新开始调试,加载项将收到新的唯一ID(即安装在主机Web中的新实例)以及您之前设置的所有列表权限都将丢失。
请注意,您可能会被迫在一天结束时停止调试并重新启动调试第二天,它将创建一个新的加载项实例。在这种情况下,您必须在主机网络上再次信任加载项,否则当您尝试在添加时再次更改列表权限时,您将获得拒绝访问 -in web。
如果您想真正智能/高效关于设置列表权限,可以在加载项中创建一个包含按钮控件的管理页面,并编写一些{{3单击按钮时在该页面上运行,这将自动为您设置列表权限。
因为默认情况下,加载项Web会继承主机Web的所有权限,所以有时可能需要中断该继承以便为用户(通常在主机Web上具有只读权限)提供帮助。加载项Web上的提升权限(例如Contribute或更多)。一个聪明的家伙用RESTful web service写了一个聪明的方法:
答案 1 :(得分:2)
不,我不认为这是可能的。如果您需要管理列表的权限,可以将其部署到主机Web并通过应用程序访问该列表。这样,应用程序将继承您在host-web中为列表定义的权限。
答案 2 :(得分:0)
编辑:该应用需要网络上的管理权限才能使其正常工作
实际上我发现它是可能的。
您必须先破坏列表中的权限,然后根据所需的用户更改列表中的角色分配:
userList是登录名列表,roleType是SP.RoleType(https://msdn.microsoft.com/en-us/library/office/jj246683.aspx)
setUserListPermissionsBatch: function (listName, userList, roleType) {
"use strict";
Permissions.resetStored();
var context,
list,
roleDefBindingColl,
i,
oUser,
deferred;
deferred = new $.Deferred(function () {
if (userList && listName && roleType) {
// Create the role
context = SP.ClientContext.get_current();
list = context.get_web().get_lists().getByTitle(listName);
roleDefBindingColl = SP.RoleDefinitionBindingCollection.newObject(context);
roleDefBindingColl.add(context.get_web().get_roleDefinitions().getByType(roleType));
// Loop the users
for (i = 0; i < userList.length; i++) {
oUser = context.get_web().get_siteUsers().getByLoginName(userList[i]);
list.get_roleAssignments().add(oUser, roleDefBindingColl);
}
context.load(list);
context.executeQueryAsync(
function () {
return deferred.resolve();
},
function (sender, args) {
console.log(args.get_message());
return deferred.reject(args);
}
);
}
});
return deferred.promise();
},
要删除权限,我必须复制当前用户权限,删除我想要删除的权限,以便在同一列表中保留该用户的其他权限。
然后重新添加新角色:
/ Removes permissions for a user
removeUserListPermissions: function (listName, userLogin, roleType) {
"use strict";
var context,
list,
user,
userRoles,
x,
rolDefs,
newRoleCollection,
deferred;
deferred = new $.Deferred(function () {
if (userLogin && listName) {
context = SP.ClientContext.get_current();
list = context.get_web().get_lists().getByTitle(listName);
user = context.get_web().get_siteUsers().getByLoginName(userLogin);
userRoles = list.get_roleAssignments().getByPrincipal(user);
context.load(user);
context.load(list);
context.load(userRoles, 'RoleDefinitionBindings');
context.executeQueryAsync(Function.createDelegate(this, function () {
newRoleCollection = SP.RoleDefinitionBindingCollection.newObject(context);
for (x = 0; x < userRoles.get_roleDefinitionBindings().get_count() ; x++) {
rolDefs = userRoles.get_roleDefinitionBindings().itemAt(x);
if (rolDefs.get_roleTypeKind() !== roleType) {
newRoleCollection.add(rolDefs);
}
}
userRoles.deleteObject();
list.get_roleAssignments().add(user, newRoleCollection);
context.load(list);
context.executeQueryAsync(function () {
return deferred.resolve();
}, function (sender, args) {
console.log("Error deleted permissions: " + args.get_message());
return deferred.reject();
});
}),
function (sender, args) {
console.log(args.get_message());
return deferred.reject();
});
} else {
return deferred.resolve();
}
});
return deferred.promise();
}
要做我刚刚使用的小组:
// Loop the groups
for (i = 0; i < groupList.length; i++) {
list.get_roleAssignments().add(context.get_web().get_siteGroups().getByName(groupList[i]), roleDefBindingColl);
}
而不是循环用户
答案 3 :(得分:-1)
尝试在您的应用名称_layouts/15/user.aspx
之后添加此名称。
即:
https://app-12345656778.yoursite.com/sites/TestSite/TestApp/_layouts/15/user.aspx
进入应用程序许可页面或添加?List=[ListId]
进入应用程序列表。