我在谷歌上搜索了很长一段时间,但找不到答案。问题是:
是否可以管理以下列表的用户权限部署到应用程序web?
我们有很多可能在宿主网站(父网站)上这样做,在那里我们可以为任何用户定义权限。在应用程序web(SharePoint应用程序域)上,我们可以直接访问所有部署的列表,并且不能为某些特定用户设置权限。我有不同的用户组,我希望他们在应用程序web上部署的列表上拥有不同的权限。我该怎么做,或者这可能吗?
如果没有,当任何应用程序用户都可以直接访问这些列表并更改数据时,这些列表可以用来做什么?
我将使用加载项术语,而不是应用程序,因为这就是微软现在对它们的称呼。
在开发过程中指定权限
答案是否定的。在开发过程中,您不能为承载SharePoint的加载项指定用户或组权限
原因很简单:外接程序网站与SharePoint场的其他部分隔离,并且可以安装在场中的任何位置。考虑到用户和组的作用域是网站集级别,如果在多个网站集中安装外接程序,则无法确定该网站集中有哪些用户和组可用
此外,如果在SharePoint应用商店中发布外接程序,则外接程序不知道它将安装在什么环境中,因此无法决定哪些用户或组可以访问外接程序web中的内容。
安装后指定权限
答案是肯定的。安装应用程序后,您可以在外接程序web中指定列表权限和项目权限,就像在宿主web中一样
默认情况下,外接程序web中的所有列表都会继承宿主web的权限,因为外接程序web本身会继承宿主web的权限。因此,你需要成为宿主网站上的网站集管理员或网站所有者,才能打破继承并更改外接程序网站中列表的权限。
一些加载项权限提示
-
您可以在宿主web中创建组,然后使用这些组为外接程序web中的列表分配权限,就像对宿主web中的列执行此操作一样。SharePoint组提供了更好的权限管理,即当新用户/员工需要列表权限时,您只需将该用户添加到网站集中任何位置都可以访问的组中,而不是直接添加到外接程序web中的列表中。
-
您可以使用SharePoint 2013工作流为外接程序web上的列表项设置权限,该工作流以提升的权限运行(请参阅AppOnlySequence活动),并进行RESTful web服务调用以更改列表项权限。
-
使用Visual Studio开发和调试/安装外接程序时,请确保在更改列表权限后不会停止调试,因为如果停止并重新开始调试,外接程序将收到一个新的唯一id(即安装在宿主web中的新实例),并且之前设置的所有列表权限都将丢失
请注意,您可能会被迫在当天结束时停止调试,并在第二天重新开始调试,这将创建外接程序的新实例。在这种情况下,您必须再次信任主机web上的加载项,否则当您再次尝试更改加载项web上的列表权限时,您将获得访问被拒绝。 -
如果您想在设置列表权限方面真正做到智能/高效,您可以在外接程序中创建一个包含按钮控件的Admin页面,还可以使用JSOM编写一些JavaScript代码,在单击按钮时在该页面上运行,这将自动为您设置列表权限。
-
因为默认情况下,外接程序网站继承了主机网站的所有权限,所以有时可能需要打破这种继承,以便为用户(通常在主机网站上具有只读权限)授予外接程序网络上的提升权限(例如,Contribute或更多)。一个聪明的家伙写了一篇关于使用的聪明方法的文章
- jQuery+REST API,用于打破继承和设置权限。(JSOM可以作为jQuery和RESTAPI的替代品使用)
- 和JSOM使用SPWeb对象的AllProperties成员设置自定义属性,以便指定已为外接程序web设置了权限
不,我认为这是不可能的。如果你需要管理列表的权限,你可以将其部署到宿主网站,并通过应用程序访问该列表。这样,应用程序将继承您在宿主网站中为列表定义的权限。
编辑:该应用程序需要Web上的管理权限才能运行
事实上,我发现这是可能的。
你必须首先打破列表上的权限,然后为你想要的任何用户更改列表上的角色分配:
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);
}
不要循环用户
尝试在应用程序名称_layouts/15/user.aspx
后添加此项。即:
https://app-12345656778.yoursite.com/sites/TestSite/TestApp/_layouts/15/user.aspx
以访问应用程序权限页面,或添加?List=[ListId]
以访问应用内的列表。