`
soleegn
  • 浏览: 148918 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论
阅读更多
    感谢大家最近对本系列的关注和评论,我会继续完善内容,并且总结教训写出更好的东东来。
    今天谈谈最近在研究的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&n
分享到:
评论

相关推荐

    一个简单的RCP入门教程

    在本教程中,我们将深入探讨如何使用RCP进行开发,通过一个简单的实例来开启你的RCP之旅。 首先,理解RCP的核心概念至关重要。**RCP应用**是由多个插件组成的,每个插件负责特定的功能。这些插件可以互相协作,共享...

    eclipse rcp 客户端MySQL连接

    在实际开发中,你可能还需要考虑线程安全、事务管理、异常处理、连接池等高级话题,以及如何将这些数据库操作封装成可复用的服务或模型组件。通过不断的实践和学习,你可以在Eclipse RCP平台上构建出功能强大的...

    简单的图书管理系统-web端+RCP客户端

    《简单的图书管理系统——Web端与RCP客户端详解》 图书管理系统是信息时代常见的软件应用,它...对于学习者而言,这个系统提供了很好的实践平台,有助于深入理解和掌握Web开发、数据库设计以及RCP应用开发的相关知识。

    eclipse4-rcp:Eclipse 4 RCP 测试项目

    通过学习和实践这个测试项目,开发者可以掌握Eclipse RCP的基本开发流程,为构建自己的桌面应用程序打下坚实基础。同时,由于Eclipse RCP的灵活性和扩展性,开发者还可以深入了解更高级的主题,如自定义布局管理器、...

    RCP中间件ICE资源

    ICE的RPC系统基于消息传递模型,具有高效、安全和灵活的特点。 **主要特性** 1. **类型安全**:ICE提供了编译时的类型安全检查,避免了因为数据类型不匹配导致的错误。 2. **多语言支持**:ICE支持多种编程语言,...

    SMS.rar_eclipse swt_java 学生成绩管理系统_rcp_学生 eclipse_成绩管理 系统 eclipse

    开发者可以通过Eclipse RCP的模型视图控制器(MVC)模式来分离用户界面和数据处理,保证数据的准确性和一致性。 2. **课程与成绩管理**:系统需允许教师录入和维护每门课程的成绩,包括课程名、学分以及每个学生的...

    webrcp.example:使用 Webstart 的 RCP 应用程序示例

    总的来说,`webrcp.example`项目为学习如何结合Java RCP和Webstart开发桌面应用提供了一个实践案例,涵盖了Java编程、桌面应用开发、网络部署和自动化更新等多个方面的重要知识点。通过研究这个项目,开发者可以深入...

    dSPACE建模规范

    dSPACE作为一种广泛应用于控制器硬件在环(HIL)仿真和快速原型设计(RCP)的技术平台,提供了强大的工具集,使工程师能够高效、精确地进行模型构建、仿真测试以及最终的嵌入式软件开发。本文旨在深入探讨dSPACE建模...

    软件工程教材习题答案.doc

    综上所述,软件工程习题涵盖了软件的本质、工程化开发的核心、不同开发模型的优缺点以及软件危机的成因和解决方案,这些都是软件工程教育和实践中的基础和关键内容。理解并掌握这些知识点对于软件开发人员来说至关...

    Eclispe CNF 框架文档

    2. **模型驱动工程(MDE)**:使用模型来描述CNF的结构和服务,简化开发和维护过程。 3. **API管理**:支持RESTful API设计和管理,促进微服务之间的交互。 4. **服务治理**:包括服务注册、健康检查、熔断和限流等...

    核电流体系统仿真需求分析.pdf

    例如,红沿河核电站的一系列调试问题通过仿真技术得到了有效解决,如通过RCP测温旁路模型分析阀门阻力、利用仿真模型检查逆止阀阻力系数等,这体现了仿真技术在实际操作中的实用性。 市场分析显示,中国核电市场...

    精通Xpages书本的配套练习题

    7. **安全性**:Xpages继承了Lotus Domino的安全模型,包括访问控制列表、角色和权限设置,确保应用程序的数据安全。 8. **部署和性能优化**:了解如何配置Domino服务器以优化Xpages应用的性能,以及如何部署和更新...

    98篇lotus.domino学术论文

    4. **数据库设计**:Lotus Domino的NoSQL数据库模型是其独特之处。论文可能会涉及如何设计和优化数据库结构,以及使用公式语言和 LotusScript 进行编程。 5. **Web服务和集成**:随着Web技术的发展,Lotus Domino的...

    OSGi 入门+进阶+实战

    5. **安全机制**:OSGi提供了细粒度的安全模型,可以控制Bundle的访问权限,确保系统安全。 6. **启动配置**:通过配置文件(如`config.ini`)可以设置启动参数,影响Bundle的加载顺序和行为。 **进阶篇** 1. **...

    eclipse插件开发---简单例子

    一旦掌握了基础,你就可以继续探索更复杂的插件开发,如使用PDE(Plug-in Development Environment)工具集、使用RCP(Rich Client Platform)创建桌面应用程序,甚至参与Eclipse社区的开源项目。

    osgi进阶

    5. **安全性**:OSGi提供了安全模型,允许对bundle进行细粒度的权限控制。可以限制bundle的某些操作,如读写文件、网络访问等。 6. **生命周期管理**:每个bundle都有一个特定的生命周期,包括安装、启动、暂停、...

    网络,服务,eclipse

    网络的基本概念包括网络模型(如OSI七层模型和TCP/IP四层模型)、网络协议(如TCP/IP协议簇)、网络拓扑结构(如总线型、星型、环型等)以及数据传输方式(如广播、单播、组播)。在实际应用中,我们还需要了解网络...

Global site tag (gtag.js) - Google Analytics