SharePointページにドキュメントライブラリがあり、10個のドキュメントがあります。
ユーザーAがログインしている場合、そのドキュメントライブラリにあるこれらのドキュメントのうち5つだけを表示するようにします。
これを機能させるためのカスタムドキュメントライブラリを作成するにはどうすればよいですか?
MOSSをインストールしています。
前もって感謝します!
SharePointページにドキュメントライブラリがあり、10個のドキュメントがあります。
ユーザーAがログインしている場合、そのドキュメントライブラリにあるこれらのドキュメントのうち5つだけを表示するようにします。
これを機能させるためのカスタムドキュメントライブラリを作成するにはどうすればよいですか?
MOSSをインストールしています。
前もって感謝します!
ドキュメントライブラリ内のドキュメントごとに異なる権限を設定できます。各アイテムで[アクセス許可の管理]オプションを選択し、ドキュメントライブラリレベルからのアクセス許可の継承を解除するだけです。アイテムレベルの権限を持つドキュメントが多すぎると、メンテナンスの悪夢が発生する可能性があることに注意してください。別のオプションは、異なる権限を持つ2つのドキュメントライブラリを作成することです。
ライブラリ内のフィールド (つまり、さまざまなロールを保持する列) に基づいてアクセス許可を壊す ItemEventReceiver を記述します。
これは、sharepoint グループに結合されたすべてのロールを保持するリストを作成することで実現しました。
すなわち
管理者 -> Web サイトの所有者 (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
}
}
}
コーディングがうまくいかず、各ファイルに権限を設定したくない場合は、3 番目のオプションがあります。アクセス許可が設定されたフォルダーを使用します。
例えば
「マネージャー」というフォルダーを作成し、権限を解除して、マネージャーのみに権限を設定します。「従業員 1」という名前の別のフォルダーを作成し、アクセス許可を解除して、投稿権限を従業員と従業員のマネージャーに設定します。
ファイルを適切なフォルダーに配置すると、フォルダーから権限が継承されます。
このようにして、マネージャーは、マネージャーのファイルと、従業員のすべてのファイルを見ることができます。ユーザーは自分のファイルのみを表示できます。
本社、地域 1、地域 2 などに対しても同様のロジックを実行できます。地域ごとに異なるグループを作成し、そのグループをフォルダーのアクセス許可に割り当てます。
この設計を使用してすべてのアクセス許可とパフォーマンスを維持することには常に懸念がありますが、750 を超えるユーザー集団と数千のドキュメントに対して同様のことを行っており、これまでのところ問題なく機能しています。