<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    探索與發現

    研究java技術

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      83 隨筆 :: 0 文章 :: 109 評論 :: 0 Trackbacks
     
    8月25日

    關于Windows Sharepoint Server的權限內容分析

    首先聲明這個領域小弟也是剛涉足, 經驗淺的很. 一些看法和說法都是卑微之語. Windows Sharepoint Server中的權限(Authorization)設置是通過中間件角色(Role)來與指定用戶(User)發生關系的. 并不如同傳統的直接給予某個用戶相應的權限. 即應該通過創建一個角色然后在其中組合不同的權限最后將一個角色賦予一個用戶. 用戶組的概念也是如此.  User/Group -- Role --Authorization
    無論當你是將一個用戶或者組添加入對于某個列表或者某個文件中獲得相應的權限. 那些關于用戶和用戶組的信息分配存放在配置數據庫的UserInfo和Groups表中. 其中tp_siteId代表了所屬站點的ID, tp_Id則是分配給用戶的ID, Groups的組織方式也基本和UserInfo差不多.  Role 即角色表, 存放所創建的角色. RoleAssignment存放角色的分配. 其中的ScopeId 會對應Perms表中的ScopeId, 當你為一個列表或者某個文件添加權限時并且不繼承父權限的時候, 在Perms表中會添加相應的新記錄內容, 并且創建它的ScopeUrl與ScopeID來標識它.  并且與RoleAssignment中的scopeId對應, 而RoleAssignment中的PrincepalId則存放對應的UserInfo中的tp_Id或者Groups中的tp_Id. 兩張表中的tp_Id是不會重復的. 搞清楚了權限組合和角色創建與分配是如何組成的. 現在來看一下如何通過Windows Sharepoint Server的對象模型以編程方式解決一些問題. 比如我想通過一個EventHandler當用戶上傳某個文件以后讓他選擇相應的本地域中已存的AD帳戶.
    實現Windows Sharepoint Server的EventHandler有兩種方式(暫時只了解兩種), 一種是實現IListEventSick接口. 這種方式的缺點暫時令我感覺到的是很難做一些更復雜的操作.  另一種方式是派生相應的操作時間類. 如果是一些內容則是SPItemEventReceiver.  具體內容可以通過Reflector反射Microsoft.Sharepoint.dll了解. 可以重寫其中的實現方法來實現我們需要的功能. 現在要編寫一個添加完Item后執行的權限分配操作. 也就是當用戶在文檔中心上傳完一個文件以后, 將一個指定的用戶添加入其中獲得該文件的相應權限.
    public override void ItemAdded(SPItemEventProperties properties){}
    通過SPItemEventProperties我們可以獲得不少關于觸發事件的Item的信息. 如SiteId(站點ID),  ListId(列表ID), ListItemId(列表項ID).  比如我要訪問那個剛上傳文檔的對象可以通過以下方式:
    SPSite sourceSite = new SPSite(properties.SiteId);
    SPWeb sourceWeb = sourceSite.OpenWeb();
    SPListItem currentListItem = sourceWeb.Lists[properties.ListTitle].Items.GetItemById(properties.ListItemId);
    每個列表條目都提供一個角色分配集合RoleAssignments屬性, 它是一個Collection. 提供基本的操作方法. 利用Add我們則可以添加相應的新的RoleAssignment元素.
    我們通過建立一個RoleAssignment的實例來添加用戶:
    SPRoleAssignment roleAssignment = new SPRoleAssignment(sourceWeb.EnsureUser(SHBEYONDBIT\chujun));
    SPRoleDefinition roleDefinition = sourceWeb.RoleDefinitions.GetByType(SPRoleType.Read);
    SPRoleType 是一個enum提供默認角色級別
    SPRoleType.Administrator = 完全控制
    SPRoleType.WebDesigner = 設計
    SPRoleType.Contributor = 參與討論
    SPRoleType.Reader = 讀取
    SPRoleType.Guest = 受限訪問
    SPRoleType.None = 僅查看
    對于我們自己創建的Role則不提供支持. 我們需要通過其它方式來獲得. 通過RoleDefinitionBindings屬性的Add方法我們添加了一個Role給予指定的用戶.
    roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
    currentListItem.BreakRoleInheritance(false);
    BreakRoleInheritance就如同我們手動設置用戶角色時選擇的是否不在繼承父權限一樣. 我們不再繼承父權限. 最后通過currentListItem.RoleAssignments.Add(roleAssignment); 為相應列表添加了某個用戶的角色.
    在這里有一點令人有些費解, 起初我并非用EnsureUser方法實現用戶添加的, 而是通過SPUserInfo創建一個實例. 將AD帳號的一些信息寫入其中. 然后通過sourceWeb.User.Add方法來實現添加, 可惜屢屢報錯說當前狀態無效. 不知有哪位高人知道為何? 不吝賜教.
    現在在來討論關于如何自定義角色問題. 在Windows Sharepoint Server中提供了相當多的權限. 并且通過SPBasePermissions這個enum來設定. 其實實現的方式大致應該是一個int類型. 然后相應的位放置1來確定吧. 即以一個unsigned short為例 00100100可能代表某個Role擁有未知的兩個權限.
    SPRoleDefinition definition = new SPRoleDefinition(); 創建角色定義的實例.
    public bool AddSiteRole(string name, string description, params SPBasePermissions[] args){
         bool flag = true;
         SPRoleDefinition definition = new SPRoleDefinition();
         definition.Name = name;
         definition.Description = description;
         foreach (SPBasePermissions arg in args){
              definition.BasePermissions |= arg;
         }
         try{
              _sourceWeb.RoleDefinitions.Add(definition);
         }
         catch{
              flag = false;    
         }
         return flag;
    }
    進行相應位置的|操作就可以分配相應的權限了. 如下:
    AddSiteRole("自定義角色1", "自定義角色1", SPBasePermissions.AddAndCustomizePages, SPBasePermissions.AddDelPrivateWebParts, SPBasePermissions.AddListItems, SPBasePermissions.ApplyStyleSheets);
    順帶一提, 因為SPUser和SPGroup都派生于SPPrincipal, 而SPRoleAssignment可以接受任何派生與SPPrincipal的類型進行添加. 想想之前數據表RoleAssignment表中的PrincepalId, 在真挺有邏輯的.
     
    最近有一個項目是針對基于Windows Sharepoint Server, 并利用Microsoft Office Sharepoint Server2007和Design的開發和部署(其實我對這個項目是頗有微辭的, 首先對于這類技術的集成還沒有掌握, 項目書上說是配置占70%以上, 其實不然以這樣的要求顯然開發占了70%以上). 并且我對這種Microsoft極度推崇的技術也是心存一些不滿的. 首先它的內容更廣一些,不僅設計了Windows WorkFlow Fundation, Web  Part, ASP.NET 2.0, CAML, Infopath以及Windows Sharepoint Server等大量內容還有許多企業應用的概念. 并與Office系列產品有高度集成. 這對于一個開發人員來說需要掌握更多的技術特性. 其實光是精通其中兩樣已經是很不容易的一回事了. 基于它的二次開發難度較大, 并且許多默認提供用戶的操作方式都不是傳統的Web用戶操作習慣. 說穿了只是Microsoft想要捆綁它的一整套產品銷售, 賣給那些政府或者大型企業而已. 哎! 感嘆做為開發人員, 不是每個項目都能選擇讓你使用你擅長的喜愛的技術.
     
    不知道有誰會在上傳完文件以后先不跳往那個定義名字和注釋的頁面, 而是跳往我想指定的頁面. 因為在Windows Sharepoint Server的那些上傳之類的都是以做完的模板, 可能有些按鈕時間是自定義的控件. 比如像那些SPWikiButton一類. 以完全將處理方法封裝起來了. 除非直接修改頁面上腳本. 但是這類都是模板無法如同那些其它的Default.aspx或者Default.Master那樣進行修改. 而也無法獲得所謂的窗體句柄. 如有實現方式請不吝賜教.
    posted on 2009-05-13 07:35 蜘蛛 閱讀(569) 評論(0)  編輯  收藏 所屬分類: 日常瑣事
    主站蜘蛛池模板: 337p日本欧洲亚洲大胆精品555588 | 国产精品亚洲一区二区三区久久| 午夜亚洲国产成人不卡在线| 黄色片免费在线观看| 亚洲六月丁香六月婷婷蜜芽| 亚洲精品亚洲人成在线观看下载| 99久久久国产精品免费蜜臀| 精品无码专区亚洲| 亚洲五月六月丁香激情| 国产福利免费在线观看| 免费无码中文字幕A级毛片| 国产亚洲综合一区二区三区| 久久噜噜噜久久亚洲va久| 黄a大片av永久免费| 国产免费爽爽视频在线观看| 亚洲美国产亚洲AV| 亚洲AV无码成人精品区蜜桃| 日本v片免费一区二区三区| 日韩插啊免费视频在线观看| 美女18毛片免费视频| 91亚洲自偷在线观看国产馆| 国产亚洲?V无码?V男人的天堂| 在线观看人成网站深夜免费| 久久国产精品免费观看| 青娱乐在线视频免费观看| 亚洲午夜成激人情在线影院| 亚洲精品乱码久久久久久蜜桃不卡| 最好免费观看韩国+日本| 日本人成在线视频免费播放| www免费插插视频| 亚洲av中文无码乱人伦在线观看| 久久精品国产精品亚洲毛片| 国产亚洲精品无码专区| 国产精品无码免费视频二三区| 1000部拍拍拍18勿入免费凤凰福利 | 91精品国产亚洲爽啪在线影院| 亚洲午夜精品久久久久久浪潮| 妞干网免费视频在线观看| 久视频精品免费观看99| 久久久久久免费一区二区三区| 中文字幕永久免费视频|