2

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

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

我们有很多可能在主机网站(父站点)上执行此操作,我们可以在其中为任何用户定义权限。在应用程序网站(SharePoint 应用程序域)上,我们可以直接访问所有已部署的列表,并且无法为某些特定用户设置权限。我有不同的用户组,我希望他们对应用程序 Web 上部署的列表具有不同的权限。我该怎么做,或者甚至可能吗?

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

4

4 回答 4

4

我将使用加载项术语而不是应用程序,因为这就是微软现在所说的。

在开发期间指定权限

答案是不。您不能在开发期间为 SharePoint 托管的加载项指定用户或组权限。
原因很简单:加载项 Web 与 SharePoint 场的其余部分隔离,它们可以安装在场中的任何位置。考虑到用户和组的范围仅限于网站集级别,如果您在多个网站集中安装外接程序,则无法说明该网站集中哪些用户和组可用。
此外,如果您在 SharePoint 商店中发布您的外接程序,该外接程序不知道将在其中安装它的环境,因此无法确定哪些用户或组可以访问该插件中的内容 -在网络中。

安装后指定权限

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

一些加载项权限提示

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

  2. 您可以使用以提升的权限运行的 SharePoint 2013 工作流(请参阅AppOnlySequence活动)为加载项 Web 上的列表项设置权限,并调用RESTful Web 服务来更改列表项权限。

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

  4. 如果您想非常聪明/高效地设置列表权限,您可以在加载项中创建一个包含按钮控件的管理页面,并使用 JSOM 编写一些 JavaScript 代码,以便在单击按钮时在该页面上运行,这将自动为您设置列表权限。

  5. 因为默认情况下,加载项 Web 会从主机 Web 继承所有权限,您有时可能需要中断该继承,以便为用户(通常在主机 Web 上具有只读权限)提供提升的权限(例如 Contribute 或更多)在加载项网站上。一个聪明的人写了一篇文章,介绍了一种聪明的方法,使用:

    • jQuery + REST API 用于打破继承和设置权限。(JSOM 可以用作 jQuery 和 REST API 的替代品)
    • 和 JSOM 使用 SPWeb 对象的AllProperties成员设置自定义属性,以指定已为加载项 Web 设置权限。
于 2015-10-19T16:31:47.750 回答
2

不,我不认为这是可能的。如果您需要管理列表的权限,您可以将其部署到主机网络并通过应用程序访问该列表。这样,应用程序将继承您在 host-web.xml 中为列表定义的权限。

于 2014-10-30T12:27:04.000 回答
0

编辑:该应用程序需要在 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);
    }

而不是循环用户

于 2015-04-23T10:47:28.767 回答
-1

尝试在您的应用名称后添加它_layouts/15/user.aspx。IE:

https://app-12345656778.yoursite.com/sites/TestSite/TestApp/_layouts/15/user.aspx 

进入应用程序权限页面或添加?List=[ListId]进入应用程序内的列表。

于 2019-01-14T23:58:31.907 回答