همان طور که می دانید در شیرپوینت، امکان مجور دهی در سطح رکورد نیز وجود دارد. برای این کار باید روی هر رکورد راست کلیک کرده و توسط گزینه Manage Permissions مجوز مورد نظر خود را به رکورد اعمال نمایید. زمانی که برای تعداد زیادی رکورد بخواهید این کار را انجام دهید، مجوزدهی به این صورت کار بسیار زمان بر و غیر منطقی می باشد.
در این پست با استفاده از برنامه نویسی Object Model می خواهیم به رکوردهای یک لیست مجوز بدهیم. فرض کنید سناریو بدین صورت است که یک لیست شیرپوینت داریم ، می خواهیم وقتی آیتم جدید اضافه شد ، به یک شخص یا گروه شیرپوینتی خاص مثلا مجوز Read اعمال شود.
ابتدا در Visual Studio 2010، یک پروژه از جنس Event Receiver به نام ER_RecordPermission ایجاد می کنیم.
بر روی ok کلیک کنید. در صفحه بعد scope اجرای برنامه از شما سوال می شود.
1- در این قسمت نام سایت شیرپوینت مورد نظر را وارد نمایید.
2- در این قسمت گزینه Deploy as a farm solution را انتخاب نمایید.(farm solution امکانات بیشتری نسبت به sandbox solution دارد.)
بر روی Next کلیک کنید تا VS به سایت مورد نظر وصل شود.
در این صفحه :
1- به صورت پیش فرض بر روی گزینه List Item Events تنظیم شده است. ما هم همین مقدار مد نظرمون هست، چون می خواهیم بر روی آیتم های لیست کار کنیم.
2- در این قسمت گزینه Custom List را انتخاب نمایید. چون لیست مورد نظر لیست سفارشی است.
3- در این قسمت موقعیت یا رخدادی که قرار است Event Handler اجرا شود، را مشخص کنید. چون در سناریو بالا ذکر شده است، وقتی آیتم اضافه شد ، پس باید رخداد An item was added انتخاب شود.
با زدن دکمه Finish پروژه جدید ایجاد می شود و می توانید در صفحه EventReceiver1.cs کدهای مورد نظر خود را وارد نمایید.
قبل از شروع برنامه نویسی موارد زیر را رعایت کنید:
حتما کد مورد نظر را در قسمت ItemAdded در بلاک
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite WebApp = new SPSite(properties.WebUrl))
{
using (SPWeb Site = WebApp.OpenWeb(properties.RelativeWebUrl))
{
کد مورد نظر
}
}
});
قرار دهید. کد RunWithElevatedPrivileges به user شما Permission اجرای برنامه را می دهد.
کدهای using Spsite و using spweb هم برای جلوگیری از مشکلات استفاده از memory در برنامه استفاده می شوند. اگر spsite و spweb توسط این دستورات مدیریت نشوند، در load های سنگین، شیرپوینت ممکنه ضعیف عمل کنه یا ممکنه به دلیل اینکه اختصاص دادن memory، با شکست مواجه می شه، از برنامه خارج شود.
این خط کد هم لیست مورد نظر را مشخص می کند:
SPListItem oSPListItem =Site.Lists[properties.ListId].GetItemById(properties.ListItemId);
همانطور که می دانید در شیرپوینت لیست ها مجوزهای خود را از سطح بالاتر خود یعنی سایت و آیتم های لیست مجوزهای خود را از سطح بالاتر خود یعنی لیست ارث بری می کنند. در این مواقع برای اعمال مجوزهای سفارشی خود باید این ارتباط را قطع کنید. در این مثال ابتدا باید مجوزهایی که را که رکورد از لیست به ارث برده است ، حذف کنیم. این امر با استفاده از تابع زیر انجام می شود.
private void RemoveAllPermissions(SPListItem CurrentlistItem)
{
//The below function Breaks the role assignment inheritance for the list and gives the current list its own copy of the role assignments
CurrentlistItem.BreakRoleInheritance(
true);
//Get the list of Role Assignments to list item and remove one by one.
SPRoleAssignmentCollection SPRoleAssColn = CurrentlistItem.RoleAssignments;
for (int i = SPRoleAssColn.Count - 1; i >= 0; i--)
{
SPRoleAssColn.Remove(i);
فراخوانی این تابع در قسمت ItemAdded به صورت زیر است:
RemoveAllPermissions (OSPListItem);
برای مجوزدهی به گروه مورد نظر از تابع زیر استفاده نمایید:
private void SetGroupPermission(SPWeb Site, SPListItem OSPListItem, string GrpName, SPRoleType PermissionType)
{
var reader = Site.RoleDefinitions.GetByType(PermissionType);
var grp = Site.Groups[GrpName];
SPRoleAssignment roleAssignment = new SPRoleAssignment(grp);
roleAssignment.RoleDefinitionBindings.Add(reader);
oSPListItem.RoleAssignments.Add(roleAssignment);
}
فراخوانی این تابع به صورت زیر است:
SetPermission(Site, OSPListItem, "نام گروه شیرپوینتی مورد نظر", SPRoleType.Reader);
این فراخوانی باعث می شود که اعضای گروه شیرپوینتی مورد نظر به رکورد مجوز read داشته باشند. اگر بخواهیداعضای گروه شیرپوینتی مورد نظر به رکورد مجوز Full Control داشته باشند، باید تابع را به این صورت فراخوانی کنید.
SetPermission(Site, OSPListItem, " نام گروه شیرپوینتی مورد نظر ", SPRoleType.Administrator);
RoleType های موجود عبارتند از :
Administrator، Contributor، Guest، None، Reader و WebDesigner. که بسته به نیاز می توانید از هر کدام استفاده نمایید.
بدین طریق می توانید به گروه های شیرپوینتی روی رکوردهای یک لیست مجوز مورد نظر خود را اعمال کنید.
حال فرض کنید در لیست فیلدی از جنس Person or Group دارید به نام "فرد گیرنده اطلاعات" و می خواهید هر نام کاربری که در این فیلد data entry شد، مجوز read به رکوردهای لیست داشته باشد.
برای این منظور و مجوزدهی به یک شخص خاص بر روی لیست شیرپوینت اگر فیلد Person or Group اجازه انتخاب چند مورد داشته باشد، از تابع زیر استفاده نمایید:
SPFieldUserValueCollection spFieldUserValueCollection = oSPListItem[" Person or Groupنام ستون"] as SPFieldUserValueCollection;
if (spFieldUserValueCollection != null)
{
foreach (SPFieldUserValue spFieldUserValue in spFieldUserValueCollection)
{
SPPrincipal spPrincipal = null;
SPUser spUser = SafeEnsureUser(Site, spFieldUserValue.LookupValue);
if (spUser != null)
spPrincipal = spUser;
else
{
SPGroup targetGroup = Site.Groups[spFieldUserValue.LookupValue];
if (targetGroup != null)
spPrincipal = targetGroup;
}
if (spPrincipal != null)
{
var reader = Site.RoleDefinitions.GetByType(SPRoleType.Reader);
SPRoleAssignment roleAssignment = new SPRoleAssignment(spPrincipal);
roleAssignment.RoleDefinitionBindings.Add(reader);
oSPListItem.RoleAssignments.Add(roleAssignment);
}
}
در این کد مجوز read به شخص مورد نظر داده شده است.
و اگر فیلد Person or Group اجازه انتخاب چند مورد نداشته باشد، از تابع زیر استفاده نمایید:
SPFieldUserValue spFieldUserValue = spListItem["Person or Groupنام ستون "] as SPFieldUserValue;
if(spFieldUserValue != null)
{
SPPrincipal spPrincipal = null;
SPUser spUser = SafeEnsureUser(spWeb, spFieldUserValue.LookupValue)
if(spUser != null)
spPrincipal = spUser;
else
{
SPGroup targetGroup = spWeb.Groups[spFieldUserValue.LookupValue];
if(targetGroup != null)
spPrincipal = targetGroup;
}
if(spPrincipal != null)
{
var reader = spWeb.RoleDefinitions.GetByType(SPRoleType.Reader);
SPRoleAssignment roleAssignment = new SPRoleAssignment(spPrincipal);
roleAssignment.RoleDefinitionBindings.Add(reader);
spListItem.RoleAssignments.Add(roleAssignment);
}
}
با این کد ، مجوز read به شخصی که در ستون "نام فرد گیرنده اطلاعات" data entry شده است، داده می شود. یعنی اگر شما روی آیتم جدید که در لیست درج شده است، راست کلیک کنید، مشاهده می کنید که فقط شخص مورد نظر مجوز read دارد.
امیدوارم لذت برده باشید.