몇일전에 워크플로 진행 상태에 따른 아이템에 대한 권한 변경을 이벤트리시버를 통해
변경되도록 개발 진행한적이 있다.

이와 같이 MOSS를 개발하게 되면, 권한 변경을 프로그램상으로 개발해야 하는 경우가 많을 것이다.
그래서 이번 기회에 리스트 아이템에 대한 권한 변경 모듈을 정리해 보려 한다.

아래 소스는 작성자에게는 기본 참가 그룹이 아닌 사용 수준 정의를 추가한 참가 그룹(특정 권한 뺌)을,
특정 관리자 그룹에게는 모든 권한을 부여하는 소스이다.
            SPPrincipal spPrincipal = null;
            SPRoleAssignment spRoleAssignment = null;

            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite spSite = new SPSite(properties.WebUrl))
                using (SPWeb spWeb = spSite.OpenWeb())
                {
                    spWeb.AllowUnsafeUpdates = true;

                    SPList spList = spWeb.Lists[properties.ListId];
                    SPListItem spListItem = spList.Items.GetItemById(properties.ListItemId);

                    try
                    {
                        // 사용 권한 수준 정의 (관리자, 참가 권한)
                        SPRoleDefinition spAdminRoleDef = spListItem.Web.RoleDefinitions.GetByType(SPRoleType.Administrator);
                        SPRoleDefinition spConRoleDef = spListItem.Web.RoleDefinitions[strContributorRoleDefName];

                        // #1. 권한 상속 여부 체크
                        if (!spListItem.HasUniqueRoleAssignments)
                        {
                            // 권한 상속을 푼다.
                            spListItem.BreakRoleInheritance(false);
                        }

                        // #2. 작성자 권한 부여
                        int authorSiteID = int.Parse(spListItem[SPBuiltInFieldId.Author].ToString().Split(new string[] { ";#" }, StringSplitOptions.RemoveEmptyEntries)[0]);
                        SPUser spAuthorUser = spListItem.Web.AllUsers.GetByID(authorSiteID);

                        spPrincipal = spAuthorUser as SPPrincipal;
                        spRoleAssignment = new SPRoleAssignment(spPrincipal);
                        spRoleAssignment.RoleDefinitionBindings.Add(spConRoleDef);
                        spListItem.RoleAssignments.Add(spRoleAssignment);


                        // #3. 관리자 그룹 권한 부여

                        // 관리자 그룹에 대해 관리 권한을 정의한다.
                        SPGroup spAdminGroup = spListItem.Web.Groups[strManageGroupName];
                        spPrincipal = spAdminGroup as SPPrincipal;

                        try
                        {
                            // 해당 SPPrincipal 에 대해 만족하는 RoleAssignment이 없을 경우, 바로 Exception 발생
                            spRoleAssignment = spListItem.RoleAssignments.GetAssignmentByPrincipal(spPrincipal);
                        }
                        catch { spRoleAssignment = null; }

                        // 관리 그룹에 대해 관리 권한이 부여되어 있지 않거나, 그룹추가가 안되어 있을 경우
                        if (spRoleAssignment == null || (spRoleAssignment != null && !spRoleAssignment.RoleDefinitionBindings.Contains(spAdminRoleDef)))
                        {
                            spRoleAssignment = new SPRoleAssignment(spPrincipal);
                            spRoleAssignment.RoleDefinitionBindings.Add(spAdminRoleDef);
                            spListItem.RoleAssignments.Add(spRoleAssignment);
                        }
                    }
                    catch (Exception ex)
                    {
                        this.LogWrite("UpdateAuthorRole의 ItemAdded 이벤트 실행중 오류가 발생하였습니다.", ex.Message);
                        spListItem.ResetRoleInheritance();
                    }

                    spListItem.SystemUpdate(false);

                    spWeb.Update();
                    spWeb.AllowUnsafeUpdates = false;
                }
            });

+ Recent posts