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

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

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

    大夢想家

    5年開發工程師,2年實施經理,X年售前顧問,......
    數據加載中……
    RCP實踐之安全模型
        感謝大家最近對本系列的關注和評論,我會繼續完善內容,并且總結教訓寫出更好的東東來。
        今天談談最近在研究的RCP安全模型,其實RCP在誕生之初就是建立在一個非常魯棒的框架之上的---OSGi,它不但有全新的概念,全新的思路,全新的熱插拔技術,還有非常好的安全模型(equinox security 項目好像還在孵化中) 。

        解決RCP的安全問題,從最近的調研中看是有四種方式:
    1.equinox security項目;
    2.使用org.eclipse.ui.activities擴展點定義可訪問權限和角色;
    3.使用Eclipse-JAAS插件;
    4.自己寫代碼在對功能點進行過濾;

       第一種方案不可行,因為equinox security項目還在孵化中,而且沒有充足的文檔,因此放棄;
       第二種方案可行,但是靈活性不夠,我們很難在項目開始之初充分的定義出所有的角色以及角色對應的權限,而且還要引入大量的配置,所以也放棄;
       第三種方案可能可行,因為從老外的文檔中看出,這個插件是可用的,而且是強大的,它的原理就是定義了一堆自己的擴展點,然后通過分析擴展點,過濾掉不可用的功能點。但是這個插件的更新時間竟然是2005年,N久都沒有人管過了~而且還是基于Eclipse3.0的實現,所以也放棄了;
        我選擇的是第四種方案,自己寫代碼對功能點進行過濾,其實思路很簡單,我們定義基類,在基類中過濾掉有那些功能點可以被顯示,或者不能被顯示。
        RCP應用中所需要關注安全點主要是:
    1.Action
    2.Viewer
    3.編輯器
    4.透視圖
        經過討論,其實我們的關注點主要集中在Action和透視圖,因為透視圖總會包含一組Viewer出現所以我們只要在透視圖布局類中將我們不需要關注的Viewer過濾掉,那么Viewer就可以被管理起來了,而編輯器的出現也主要是針對Viewer出現的,如果一個Viewer不能顯示,那么和它對應的編輯器也永遠無法顯示,所以編輯器幾乎不用考慮。
       其實安全模型的核心就是Action,Viewer,透視圖。
       對于Action,存在兩種,一種是開發人員自己在代碼中創建出來的Action(new Action),另一種就是在plugin.xml中配置的。
      第一種情況的基類:
     1package com.glnpu.dmp.client.platform.core.internal.security.absaction;
     2
     3import org.apache.log4j.Logger;
     4import org.eclipse.jface.action.Action;
     5import org.eclipse.jface.resource.ImageDescriptor;
     6
     7import com.glnpu.dmp.client.platform.core.internal.security.SecurityManager;
     8
     9/**
    10 * 繼承自<code>Action</code>,在構造方法中加入用戶權限判斷。
    11 * @author lign
    12 *
    13 */

    14public abstract class AbstractSecurityAction extends Action {
    15    private Logger log = Logger.getLogger(this.getClass());
    16    
    17    public AbstractSecurityAction(String text, ImageDescriptor image){
    18        super(text, image);
    19        this.setActionId();
    20        log.debug("當前處理的Action為: " + this.getId());
    21        //權限判斷
    22        SecurityManager.securityFiltration(this);
    23    }

    24    /**
    25     * 實現者必須實現此方法,并在方法內調用setId方法,為Action命名。
    26     */

    27    public abstract void setActionId();
    28}
    開發人員自己創建的Action都繼承自AbstractSecurityAction類,在此類的構造方法中,調用SecurityManager.securityFiltration(this);方法,判斷當前Action的ID是否與當前用戶權限的中的ID相同,如果相同則調用action.setEnabled(true);,否則則是action.setEnabled(false);
        /**
         * 通過傳入的IAction實例的id,判斷是否與用戶對應的權限相同,如果存在與用戶權限中,則此IAction為可視,否則為不可視。
         * 
    @param action
         
    */

        
    public static void securityFiltration(IAction action){
            
    if(action!=null{
                action.setEnabled(
    false);
                
    if(action.getId()!=null && !action.getId().equals("")) {
                    log.debug(
    "當前處理的Action為 : " + action.getId() + " 當前用戶可用Action列表長度為 :" + UserInfo.getInstance().getActionList().size());
                    
    for(String str : UserInfo.getInstance().getActionList()) {
                        
    if(str.equals(action.getId())) {
                            action.setEnabled(
    true);
                            log.debug(
    "當前Action : " + action.getId() + "與用戶可用Action列表中Action匹配,此Action可顯示");
                            
    return;
                        }

                    }

                }

            }

        }

       第二種情況的基類:
     1package com.glnpu.dmp.client.platform.core.internal.security.absaction;
     2
     3import org.eclipse.jface.action.IAction;
     4import org.eclipse.jface.viewers.ISelection;
     5import org.eclipse.ui.IEditorActionDelegate;
     6import org.eclipse.ui.IEditorPart;
     7
     8import com.glnpu.dmp.client.platform.core.internal.security.SecurityManager;
     9
    10/**
    11 * 實現自<code>IEditorActionDelegate</code>重載selectionChanged方法,在其中加入用戶權限判斷。
    12 * @author lign
    13 *
    14 */

    15public abstract class AbstractSecurityEditorActionDelegate implements IEditorActionDelegate {
    16
    17    /* (non-Javadoc)
    18     * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction, org.eclipse.ui.IEditorPart)
    19     */

    20    public abstract void setActiveEditor(IAction action, IEditorPart targetEditor);
    21
    22    /* (non-Javadoc)
    23     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
    24     */

    25    public abstract void run(IAction action);
    26
    27    /* 
    28     * 重載方法,加入權限判斷重置Action是否可用
    29     */

    30    public void selectionChanged(IAction action, ISelection selection) {
    31        //判斷權限
    32        SecurityManager.securityFiltration(action);
    33    }

    34
    35}
    以上是擴展editorAction擴展點時要繼承的基類,其他兩種情況同它相同。
       這種方法雖然笨拙,但是還是有用的。
       Viewer的顯示總是依靠某一個透視圖的,因此就有了我們的透視圖基類:
     1package com.glnpu.dmp.client.platform.core.internal.security.absperspective;
     2
     3import java.util.ArrayList;
     4import java.util.List;
     5
     6import org.apache.log4j.Logger;
     7import org.eclipse.ui.IFolderLayout;
     8import org.eclipse.ui.IPageLayout;
     9import org.eclipse.ui.IPerspectiveFactory;
    10
    11import com.glnpu.dmp.client.platform.core.internal.security.SecurityManager;
    12
    13/**
    14 * 實現自<code>IPerspectiveFactory</code>,提供標準布局,及左側為Viewers,底部為Viewers
    15 * @author lign
    16 *
    17 */

    18public abstract class AbstractSecurityPerspective implements IPerspectiveFactory {
    19    
    20    private Logger log = Logger.getLogger(this.getClass());
    21    
    22    protected String [] leftViewerIds = null;
    23    protected String [] bottomViewerIds = null;
    24    protected String perspectiveName = null;
    25    
    26    /* (non-Javadoc)
    27     * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
    28     */

    29    public void createInitialLayout(IPageLayout layout) {
    30        List<String> leftViewerList = getLeftViewers(leftViewerIds);
    31        log.debug("當前用戶可用的leftViewer列表長度為 : " + leftViewerList.size());
    32        if(leftViewerList.size()>0{
    33            IFolderLayout folderLayoutLeft = layout.createFolder(this.perspectiveName+"Left", IPageLayout.LEFT, 0.25f, layout.getEditorArea()); 
    34            for(String str : leftViewerList) {
    35                folderLayoutLeft.addView(str);
    36                layout.getViewLayout(str).setCloseable(false);
    37            }

    38        }

    39
    40        List<String> bottomViewerList = getBottomViewers(bottomViewerIds);
    41        log.debug("當前用戶可用的bottomViewer列表長度為 : " + bottomViewerList.size());
    42        if(bottomViewerList.size()>0{
    43            IFolderLayout folderLayoutBottom = layout.createFolder(this.perspectiveName+"Bottom", IPageLayout.BOTTOM, 0.80f, layout.getEditorArea()); 
    44            for(String str : bottomViewerList) {
    45                folderLayoutBottom.addView(str);
    46                layout.getViewLayout(str).setCloseable(false);
    47            }

    48        }

    49    }

    50    
    51    /**
    52     * 過濾不可顯示的左側Viewer
    53     * @param leftViewerIds
    54     * @return
    55     */

    56    private List<String> getLeftViewers(String [] leftViewerIds) {
    57        List<String> _list = new ArrayList<String>();
    58        for(String str : leftViewerIds) {
    59            if(SecurityManager.isSecurityViewer(str)) {
    60                _list.add(str);
    61            }

    62        }

    63        return _list;
    64    }

    65    
    66    /**
    67     * 過濾不可顯示的底部Viewer
    68     * @param bottomViewerIds
    69     * @return
    70     */

    71    private List<String> getBottomViewers(String [] bottomViewerIds) {
    72        List<String> _list = new ArrayList<String>();
    73        for(String str : bottomViewerIds) {
    74            if(SecurityManager.isSecurityViewer(str)) {
    75                _list.add(str);
    76            }

    77        }

    78        return _list;
    79    }

    80}
    其子類需要在構造方法中給父類的leftViewerIds,bottomViewerIds和perspectiveName屬性付值,及傳給父類左側需要放置那些Viewer的ID,底部需要放置那些Viewer的ID,剩下的就是過濾了。
       其實最麻煩的是過濾透視圖,透視圖是必須配置到plugin.xml中的,只要配置進去,我們基本上就不能做什么操作了,在透視圖的菜單中有Other...項,會列出所有的透視圖。我們的解決辦法是:
     1    /**
     2     * 在RCP程序的ApplicationWorkbenchWindowAdvisor類的postWindowCreate()方法中調用,用于刪除無權限操作的Perspective
     3     * @param pr
     4     */

     5    public static void perspectiveFiltration(PerspectiveRegistry pr) {
     6        IPerspectiveDescriptor[] _ipd = pr.getPerspectives();
     7        Object [] _objs = new Object[_ipd.length];
     8        for(int i=0; i<_ipd.length; i++{
     9            if(!isSecurityPerspective(_ipd[i].getId())) {
    10                _objs[i] = _ipd[i];
    11            }

    12        }

    13        log.debug("從已注冊的Perspective列表中刪除Perspectives為: " + _objs.toString());
    14        pr.removeExtension(null, _objs);
    15        log.debug("需要重新注冊新的默認Perspective頁");
    16        setDefautlPerspectice(pr);
    17    }
    取得透視圖注冊器,然后移除不可用的擴展點。但是Eclipse在移除擴展點時有一個BUG會彈出一個錯誤對話框,但是移除擴展點的代碼照樣執行,至少在3.2.2中這個BUG是存在的,而且在Eclipse的BUG管理器中,這個BUG已經提出來了,聽說是正在修復。沒關系,還好它是開源的,到最后產品發布的時候它還沒有修改,我們就自己改了。
       到此,安全文件就這樣解決了,希望大家說說自己的看法,肯定有比我更好的辦法解決,不妨貢獻出來,我們互相學習。


    客戶虐我千百遍,我待客戶如初戀!

    posted on 2007-06-21 21:52 阿南 閱讀(2088) 評論(5)  編輯  收藏 所屬分類: Eclipse-RCP西安java用戶群

    評論

    # re: RCP實踐之安全模型 2007-06-22 14:05 SoulEngineer

    好!基本上和我思路一樣,不過可以自己嘗試著加入JAAS的內容,這個必竟是SUN官方的東西
      回復  更多評論    

    # re: RCP實踐之安全模型 2007-06-24 21:43 阿南

    好消息,Eclipse3.3已經修正了那個BUG了~
      回復  更多評論    

    # re: RCP實踐之安全模型 2007-07-28 10:11 SoulEngineer

    現在在想,如果能把安全模型做到無侵入就好了
      回復  更多評論    

    # re: RCP實踐之安全模型 2008-10-06 22:30 CHENZHY

    最近也一直在擺弄這個東西,關于權限控制總是不得要領,版主要是能發個比較全一些的模型就好了,謝謝了。zhongyu-chen@163.com
    不勝感激!
      回復  更多評論    

    # re: RCP實踐之安全模型 2009-07-06 13:40 單飛

    呵呵,最好能夠封裝成為一個無侵入的插件.統一對Action和View/Editor進行管理,或者使用Perspective也不錯哦.
      回復  更多評論    
    主站蜘蛛池模板: 亚洲永久永久永久永久永久精品| 天天看片天天爽_免费播放| 日本亚洲中午字幕乱码| 深夜a级毛片免费视频| 青青操视频在线免费观看| 久久精品人成免费| 日韩视频在线免费| 亚洲精品字幕在线观看| 亚洲日韩国产精品无码av| 亚洲狠狠婷婷综合久久蜜芽| av网站免费线看| 美女网站免费福利视频| 亚洲色精品aⅴ一区区三区| 亚洲一级黄色大片| 日本永久免费a∨在线视频| 亚洲精品乱码久久久久久不卡| 亚洲一区精品视频在线| 女人被男人躁的女爽免费视频| 亚洲av午夜国产精品无码中文字| 8x成人永久免费视频| 亚洲一级毛片在线观| 日本一道在线日本一道高清不卡免费 | 暖暖在线视频免费视频| 免费jjzz在线播放国产| 亚洲酒色1314狠狠做| 免费精品久久天干天干| 亚洲精品无码久久久| 国产激情免费视频在线观看| 亚洲人成在线免费观看| 中文字幕无码播放免费| 18gay台湾男同亚洲男同| 手机在线毛片免费播放| 亚洲av成人综合网| 亚洲国产精品成人| 亚洲AV无码一区二区三区性色| 国产亚洲成人久久| 一级毛片a免费播放王色电影 | 国产亚洲无线码一区二区 | 亚洲一区免费视频| 亚洲激情视频在线观看| 国产成人自产拍免费视频|