SharePoint Hosted App 2013 - 列出应用程序级别的权限

时间:2014-10-30 12:16:15

标签: sharepoint sharepoint-2013 sharepoint-apps

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

  

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

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

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

4 个答案:

答案 0 :(得分:4)

  

我将使用加载项术语而不是应用,因为这是Microsoft calls them now

在开发期间指定权限

答案是否定的。您无法在开发期间为SharePoint托管的加载项指定用户或组权限 原因很简单:加载项Web与SharePoint场的其余部分隔离,并且可以安装在服务器场中的任何位置。考虑到用户和组的范围限定为网站集级别,如果在多个网站集中安装加载项,则无法说明该网站集中有哪些用户和组可用。
此外,如果您在SharePoint Store中发布加载项,则加载项不会知道安装它的环境,因此无法确定哪些用户或组可以访问添加的内容 - 在网上。

安装后指定权限

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

某些加载项权限提示

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

  2. 您可以使用以提升的权限运行的SharePoint 2013工作流设置加载项Web上的列表项的权限(请参阅assign permissions to lists活动)并进行AppOnlySequence调用以更改列表项权限。

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

  4. 如果您想真正智能/高效关于设置列表权限,可以在加载项中创建一个包含按钮控件的管理页面,并编写一些{{3单击按钮时在该页面上运行,这将自动为您设置列表权限。

  5. 因为默认情况下,加载项Web会继承主机Web的所有权限,所以有时可能需要中断该继承以便为用户(通常在主机Web上具有只读权限)提供帮助。加载项Web上的提升权限(例如Contribute或更多)。一个聪明的家伙用RESTful web service写了一个聪明的方法:

    • jQuery + REST API,用于破坏继承和设置权限。 (JSOM可以用作jQuery和REST API的替代品)
    • 和JSOM使用SPWeb对象的JavaScript code using JSOM成员设置自定义属性,以指定已为加载项Web设置权限。

答案 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]进入应用程序列表。