2

我的 SharePoint 页面中有一个文档库,其中有 10 个文档。

如果用户 A 已登录,我希望他只能看到该文档库中的 5 个文档。

如何创建一些自定义文档库以使其正常工作?

我已经安装了MOSS。

提前致谢!

4

3 回答 3

3

您可以为文档库中的每个文档配置不同的权限。只需在每个项目上选择“管理权限”选项,并从文档库级别中断权限继承。请注意,拥有太多具有项目级别权限的文档可能会给您带来维护噩梦。另一种选择可能是创建两个具有不同权限的文档库。

于 2009-06-29T14:19:45.083 回答
3

编写一个 ItemEventReceiver,它根据库中的一个字段(即持有不同角色的列)打破权限。

我们通过创建一个包含与共享点组耦合的所有角色的列表来做到这一点。

IE

管理员 -> 网站所有者 (SPGroup)、公司管理员 (SPGroup)

经理 -> 经理(SPGroup)

然后在我们的内容类型中,我们有一个指向该列表的查找列。

这是 ItemEventReceiver 的代码:

public override void ItemUpdated(SPItemEventProperties properties)
{
lock (_lock)
{
try
{
    using (SPSite site = new SPSite(properties.SiteId,
            properties.ListItem.ParentList.ParentWeb.Site.SystemAccount.UserToken))
    using (SPWeb web = site.OpenWeb(properties.RelativeWebUrl))
    {
        web.AllowUnsafeUpdates = true;
        var item = web.Lists[properties.ListId].GetItemById(properties.ListItemId);

        var roles = item["Roles"] as SPFieldLookupValueCollection;
        var rolesList = web.Site.RootWeb.Lists["Company Roles"];
        var groupsToAdd = new List<SPFieldUserValue>();

        if (item.HasUniqueRoleAssignments)
        {
            item.ResetRoleInheritance();
            item = item.ParentList.GetItemById(item.ID);
        }

        if (roles != null && roles.Count > 0)
        {
            // Iterate over the roles and see if there is a group associated
            foreach (var role in roles)
            {
                var roleItem = rolesList.GetItemById(rol.LookupId);
                if (roleItem != null)
                {
                    // This is the SPgroup field in the rolesList
                    var groups = roleItem["Groups"] as SPFieldUserValueCollection;
                    if (groups != null)
                    {
                        groupsToAdd.AddRange(from g in groups
                                             where g.User == null
                                             select g);
                    }
                }
            }
            if (groupsToAdd.Count > 0)
            {
                item.BreakRoleInheritance(false);
                foreach (var value in groupsToAdd)
                {
                    var group = web.Groups[value.LookupValue];
                    var assignment = web.RoleAssignments.GetAssignmentByPrincipal(group);
                    item.RoleAssignments.Add(assignment);
                }
            }
        }

        DisableEventFiring();
        item.SystemUpdate(false);
        EnableEventFiring();
    }
}
catch (Exception ex)
{
    //LOG ERROR
}
}
}
于 2009-06-30T06:43:57.157 回答
1

如果编码对您不起作用,并且您不想为每个文件设置权限,那么还有第三种选择。我们使用设置了权限的文件夹。

例如

创建一个名为“Managers”的文件夹,打破权限,并将权限设置为仅管理员。创建另一个名为“Employee 1”的文件夹,中断权限,并将 Contribute 权限设置给 Employee 和 Employe 的经理。

将文件放在适当的文件夹中,它将继承该文件夹的权限。

这样,经理可以看到经理文件,以及他们员工的所有文件。用户只能看到自己的文件。

可以对总部、区域 1、区域 2 等执行类似的逻辑......并为每个区域创建不同的组,然后将组分配给文件夹的权限。

请注意,使用这种设计来维护所有权限和性能总是令人担忧,但我们一直在为 750 多个用户群和数千个文档做类似的事情,到目前为止它对我们来说运行良好。

于 2009-09-25T16:50:05.787 回答