探索與發現

          研究java技術

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            83 隨筆 :: 0 文章 :: 109 評論 :: 0 Trackbacks
          SPSecurity.RunWithElevatedPrivileges(delegate()
          {
          // implementation details omitted
          });

          可以提升代碼的運行權限,實現模擬管理員身份的功能。

          在RunWithElevatedPrivileges中不要使用 SPContext.Current.Web,SPContext.Current.Site,SPControl.GetContextWeb(HttpContext.Current) 之類的根據當前上下文得到當前的Web或者Site,根據這些方法得到的所有對象(包括從根據這些對象得到的List,ListItem等等對象)都是以 當前網站登錄用戶權限運作的,即使是在RunWithElevatedPrivileges其運作權限也不會是管理員。

          所以,如果要真正讓在RunWithElevatedPrivileges中的代碼以管理員權限正常運作的話,必須重新初始化相應的對象,比如:

          SPSecurity.RunWithElevatedPrivileges(delegate()
          {
          using (SPSite mySite = new SPSite(SPContext.Current.Site.Url))
          {
          Response.Write(mySite.RootWeb.CurrentUser.LoginName);
          }
          });
          以上mySite.RootWeb.CurrentUser.LoginName返回的是管理員的登錄帳號。
          但是如果按之前所說使用SPContext:
          SPSecurity.RunWithElevatedPrivileges(delegate()
          {
          Response.Write(SPContext.Current.Web.CurrentUser.LoginName);
          });

          這時候即使在提升權限的范圍內運行,得到的也是當前網站登錄帳戶名,而不是管理員登錄帳號

          public class DemoHandler : SPItemEventReceiver //繼承SharePoint數據條目事件監控類
          {
              
          public override void ItemAdded(SPItemEventProperties properties)  //重載ItemAdded函數,監控新建列表條目事件
              {
                   SPSecurity.RunWithElevatedPrivileges(
          delegate()      //用此方法模擬管理員賬戶運行此事件處理程序
                  {
                      
          using (SPSite site = new SPSite(properties.SiteId))    //用此方法的話就不用dispose()了
                      {
                          
          using (SPWeb web = site.OpenWeb(properties.OpenWeb().ID))  //注意獲得web的方法!!!
                          {
                              
          try
                              
          {
                                   SPList list
          = web.Lists[properties.ListId];     //獲得觸發事件的列表
                                   SPListItem item = list.Items.GetItemById(properties.ListItemId);    //獲得觸發事件的列表條目

                                  
          if (!item.HasUniqueRoleAssignments) item.BreakRoleInheritance(false);   //將此條目取消權限繼承,如果是“false”,則將去除所有權限,只保留系統賬戶,如果是“true”,則將上一級權限復制過來。
                                   SPUser user = web.Users.GetByID(properties.CurrentUserId);    //獲得觸發此事件的用戶

                                   SPRoleAssignment ra
          = new SPRoleAssignment(web.EnsureUser(user.LoginName));   //生成一個新的角色分配
                                   ra.RoleDefinitionBindings.Add(web.RoleDefinitions["讀取"]);    //將此角色分配綁定“讀取”權限級別
                                   item.RoleAssignments.Add(ra);     //將此新權限綁定到列表條目上
                               }

                              
          catch (Exception ee)
                              
          {
                               }

                           }


                        }

                   }

                   );
               }

          }

          posted on 2009-05-13 07:37 蜘蛛 閱讀(874) 評論(1)  編輯  收藏 所屬分類: 日常瑣事

          評論

          # re: 提升代碼的運行權限,實現模擬管理員身份的功能 2009-05-13 07:38 蜘蛛
          給Web添加用戶權限
          SPSite site = new SPSite("http://siteurl");
          SPWeb web = site.RootWeb;
          SPUser user = web.AllUsers["domain\\userloginname"];
          SPRoleDefinition role = web.RoleDefinitions["Full Control"]; //或者Contribute,Design,Read
          SPRoleAssignment assignment = new SPRoleAssignment(user);
          assignment.RoleDefinitionBindings.Add(role);
          web.RoleAssignments.Add(assignment);

          給List
          list.RoleAssignments.Add(assignment);

          給Item
          item.RoleAssignments.Add(assignment);  回復  更多評論
            

          主站蜘蛛池模板: 吴旗县| 罗平县| 乌什县| 阿克陶县| 东阳市| 新营市| 吴堡县| 图们市| 浪卡子县| 日喀则市| 盐城市| 郓城县| 荣昌县| 西充县| 泰顺县| 吉林省| 辽阳市| 博野县| 睢宁县| 江西省| 保德县| 古田县| 灯塔市| 循化| 绵竹市| 无棣县| 诸暨市| 河西区| 垦利县| 英吉沙县| 连平县| 长丰县| 保定市| 威海市| 洮南市| 武宁县| 德保县| 宕昌县| 大冶市| 蓬安县| 五家渠市|