SharePoint托管应用程序2013-列出应用程序级别的权限



我在谷歌上搜索了很长一段时间,但找不到答案。问题是:

是否可以管理以下列表的用户权限部署到应用程序web?

我们有很多可能在宿主网站(父网站)上这样做,在那里我们可以为任何用户定义权限。在应用程序web(SharePoint应用程序域)上,我们可以直接访问所有部署的列表,并且不能为某些特定用户设置权限。我有不同的用户组,我希望他们在应用程序web上部署的列表上拥有不同的权限。我该怎么做,或者这可能吗?

如果没有,当任何应用程序用户都可以直接访问这些列表并更改数据时,这些列表可以用来做什么?

我将使用加载项术语,而不是应用程序,因为这就是微软现在对它们的称呼。

在开发过程中指定权限

答案是否定的。在开发过程中,您不能为承载SharePoint的加载项指定用户或组权限
原因很简单:外接程序网站与SharePoint场的其他部分隔离,并且可以安装在场中的任何位置。考虑到用户和组的作用域是网站集级别,如果在多个网站集中安装外接程序,则无法确定该网站集中有哪些用户和组可用
此外,如果在SharePoint应用商店中发布外接程序,则外接程序不知道它将安装在什么环境中,因此无法决定哪些用户或组可以访问外接程序web中的内容。

安装后指定权限

答案是肯定的。安装应用程序后,您可以在外接程序web中指定列表权限和项目权限,就像在宿主web中一样
默认情况下,外接程序web中的所有列表都会继承宿主web的权限,因为外接程序web本身会继承宿主web的权限。因此,你需要成为宿主网站上的网站集管理员或网站所有者,才能打破继承并更改外接程序网站中列表的权限。

一些加载项权限提示

  1. 您可以在宿主web中创建组,然后使用这些组为外接程序web中的列表分配权限,就像对宿主web中的列执行此操作一样。SharePoint组提供了更好的权限管理,即当新用户/员工需要列表权限时,您只需将该用户添加到网站集中任何位置都可以访问的组中,而不是直接添加到外接程序web中的列表中。

  2. 您可以使用SharePoint 2013工作流为外接程序web上的列表项设置权限,该工作流以提升的权限运行(请参阅AppOnlySequence活动),并进行RESTful web服务调用以更改列表项权限。

  3. 使用Visual Studio开发和调试/安装外接程序时,请确保在更改列表权限后不会停止调试,因为如果停止并重新开始调试,外接程序将收到一个新的唯一id(即安装在宿主web中的新实例),并且之前设置的所有列表权限都将丢失
    请注意,您可能会被迫在当天结束时停止调试,并在第二天重新开始调试,这将创建外接程序的新实例。在这种情况下,您必须再次信任主机web上的加载项,否则当您再次尝试更改加载项web上的列表权限时,您将获得访问被拒绝

  4. 如果您想在设置列表权限方面真正做到智能/高效,您可以在外接程序中创建一个包含按钮控件的Admin页面,还可以使用JSOM编写一些JavaScript代码,在单击按钮时在该页面上运行,这将自动为您设置列表权限。

  5. 因为默认情况下,外接程序网站继承了主机网站的所有权限,所以有时可能需要打破这种继承,以便为用户(通常在主机网站上具有只读权限)授予外接程序网络上的提升权限(例如,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]以访问应用内的列表。

相关内容

  • 没有找到相关文章

最新更新