- 浏览: 148918 次
- 性别:
文章分类
最新评论
-
yjp:
效果丢失了,也好不了多少
SWT中使用JFreeChart(无需SWT_AWT) -
vfbrhvfbgd:
LZ,您好,
在网上找到了很多类似你这样的代码,请问您这 ...
一个使用SWT Ribbon代替Eclipse-RCP上面Coolbar的例子~ -
sdyjmc:
我也在看,发现Search不起作用。msn:sdyjmc@16 ...
读jlibrary代码的部分疑问,希望有人解答~ -
alaham:
jlibray研究得如何了呢?权限问题解决了吗?
我目前也正 ...
读jlibrary代码的部分疑问,希望有人解答~ -
bbiao:
你把代码抄错了,范型是不可以这么定义的....
这种模式我也 ...
从Hibernate范型DAO设计打造的自用DAO
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中配置的。
第一种情况的基类:
第二种情况的基类:
这种方法虽然笨拙,但是还是有用的。
Viewer的显示总是依靠某一个透视图的,因此就有了我们的透视图基类:
今天谈谈最近在研究的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);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}
/** *//**
* 通过传入的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;
}
}
}
}
}
* 通过传入的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扩展点时要继承的基类,其他两种情况同它相同。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}
这种方法虽然笨拙,但是还是有用的。
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
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
发表评论
-
来自网络上的经典文章收藏帖(不断增加中... ...)
2007-05-15 09:14 1039教你如何使用JFace创建Wizards Creating J ... -
RCP程序怎样实现自适应分辩率最大化(增加版)
2007-05-15 14:02 1322交口称赞在BLOG中提到了一种让RCP最大化的方法: 在App ... -
如何在ViewPart上添加ViewToolBar
2007-05-15 17:58 3791ViewToolBar其实就是Actions。在ViewPar ... -
郁闷的Perspective
2007-05-15 18:11 956下午正式开始RCP开发,于是乎轻车熟路的开始打基础框架。 ... -
读jlibrary代码的部分疑问,希望有人解答~
2007-05-18 10:30 1332昨天在Bolg中贴出来一个很不错的RCP项目http://jl ... -
简单应用Maven2
2007-05-18 13:54 871Maven2对项目的管理确实可以说是无微不至的,而且给出了大量 ... -
介绍一个好站
2007-05-20 10:42 808http://www.krugle.com/代码搜索工具,使用 ... -
Eclipse3.3m7 VS Eclipse3.2.2
2007-05-22 08:37 1102Eclipse3.3m7 VS Eclipse3.2.2没有深 ... -
西安java用户群成立~_~
2007-05-23 15:58 813西安java用户群,感谢dudu,为我们开通团队,所有西安ja ... -
RCP的异常
2007-05-25 12:53 894上次的一篇文章问到为什么TreeViewer没有刷新, ... -
正在规划一个Eclipse上看RSS的Plugin
2007-06-04 08:50 963目前正在规划阶段,初步想法是,实现一个周博通的EclipseP ... -
初识DB4O
2007-06-10 11:15 752DB4O? 新出的OODBMS~取谐音DB fo ... -
如何用WebStart部署RCP应用程序?
2007-06-11 17:19 903上传一份同事写的预研文档:WebStartToRCP.doc ... -
RCP开发者的好去处之ICON系列(持续更新中... ...)
2007-06-11 20:49 878为了找个合适的图片是不是头大的不像样子了?OK,我现在 ... -
庆祝一下~RCP开发者的福音到了!
2007-06-14 22:04 848今天在Eclipse站上学习如何使用Maven2管理Eclip ... -
再次理解Eclipse的类加载机制
2007-06-18 15:13 1086今天在写RCP的基础运行插件的时候,发现一个非常有意思的问题: ... -
插件开发依赖其他插件时一定要注意!
2007-06-19 14:18 2229插件开发依赖其他插件时,我们要在plugin.xml的depe ... -
RCP实践之软件架构
2007-06-19 21:22 685RCP还是新兴的东西,大家都是用它做做小东东,所以在网 ... -
RCP实践之第三方JAR包
2007-06-20 21:43 3196感谢大家对上一篇文章的拍砖,引起的反响不小,目的达到了 ... -
我们是幸福的Blogger~
2007-06-24 20:23 770因为有DUDU~所以我们一群幸福的Blogger。 ...
相关推荐
在本教程中,我们将深入探讨如何使用RCP进行开发,通过一个简单的实例来开启你的RCP之旅。 首先,理解RCP的核心概念至关重要。**RCP应用**是由多个插件组成的,每个插件负责特定的功能。这些插件可以互相协作,共享...
在实际开发中,你可能还需要考虑线程安全、事务管理、异常处理、连接池等高级话题,以及如何将这些数据库操作封装成可复用的服务或模型组件。通过不断的实践和学习,你可以在Eclipse RCP平台上构建出功能强大的...
《简单的图书管理系统——Web端与RCP客户端详解》 图书管理系统是信息时代常见的软件应用,它...对于学习者而言,这个系统提供了很好的实践平台,有助于深入理解和掌握Web开发、数据库设计以及RCP应用开发的相关知识。
通过学习和实践这个测试项目,开发者可以掌握Eclipse RCP的基本开发流程,为构建自己的桌面应用程序打下坚实基础。同时,由于Eclipse RCP的灵活性和扩展性,开发者还可以深入了解更高级的主题,如自定义布局管理器、...
ICE的RPC系统基于消息传递模型,具有高效、安全和灵活的特点。 **主要特性** 1. **类型安全**:ICE提供了编译时的类型安全检查,避免了因为数据类型不匹配导致的错误。 2. **多语言支持**:ICE支持多种编程语言,...
开发者可以通过Eclipse RCP的模型视图控制器(MVC)模式来分离用户界面和数据处理,保证数据的准确性和一致性。 2. **课程与成绩管理**:系统需允许教师录入和维护每门课程的成绩,包括课程名、学分以及每个学生的...
总的来说,`webrcp.example`项目为学习如何结合Java RCP和Webstart开发桌面应用提供了一个实践案例,涵盖了Java编程、桌面应用开发、网络部署和自动化更新等多个方面的重要知识点。通过研究这个项目,开发者可以深入...
dSPACE作为一种广泛应用于控制器硬件在环(HIL)仿真和快速原型设计(RCP)的技术平台,提供了强大的工具集,使工程师能够高效、精确地进行模型构建、仿真测试以及最终的嵌入式软件开发。本文旨在深入探讨dSPACE建模...
综上所述,软件工程习题涵盖了软件的本质、工程化开发的核心、不同开发模型的优缺点以及软件危机的成因和解决方案,这些都是软件工程教育和实践中的基础和关键内容。理解并掌握这些知识点对于软件开发人员来说至关...
2. **模型驱动工程(MDE)**:使用模型来描述CNF的结构和服务,简化开发和维护过程。 3. **API管理**:支持RESTful API设计和管理,促进微服务之间的交互。 4. **服务治理**:包括服务注册、健康检查、熔断和限流等...
例如,红沿河核电站的一系列调试问题通过仿真技术得到了有效解决,如通过RCP测温旁路模型分析阀门阻力、利用仿真模型检查逆止阀阻力系数等,这体现了仿真技术在实际操作中的实用性。 市场分析显示,中国核电市场...
7. **安全性**:Xpages继承了Lotus Domino的安全模型,包括访问控制列表、角色和权限设置,确保应用程序的数据安全。 8. **部署和性能优化**:了解如何配置Domino服务器以优化Xpages应用的性能,以及如何部署和更新...
4. **数据库设计**:Lotus Domino的NoSQL数据库模型是其独特之处。论文可能会涉及如何设计和优化数据库结构,以及使用公式语言和 LotusScript 进行编程。 5. **Web服务和集成**:随着Web技术的发展,Lotus Domino的...
5. **安全机制**:OSGi提供了细粒度的安全模型,可以控制Bundle的访问权限,确保系统安全。 6. **启动配置**:通过配置文件(如`config.ini`)可以设置启动参数,影响Bundle的加载顺序和行为。 **进阶篇** 1. **...
一旦掌握了基础,你就可以继续探索更复杂的插件开发,如使用PDE(Plug-in Development Environment)工具集、使用RCP(Rich Client Platform)创建桌面应用程序,甚至参与Eclipse社区的开源项目。
5. **安全性**:OSGi提供了安全模型,允许对bundle进行细粒度的权限控制。可以限制bundle的某些操作,如读写文件、网络访问等。 6. **生命周期管理**:每个bundle都有一个特定的生命周期,包括安装、启动、暂停、...
网络的基本概念包括网络模型(如OSI七层模型和TCP/IP四层模型)、网络协议(如TCP/IP协议簇)、网络拓扑结构(如总线型、星型、环型等)以及数据传输方式(如广播、单播、组播)。在实际应用中,我们还需要了解网络...