- 浏览: 142710 次
- 性别:
文章分类
最新评论
-
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 971教你如何使用JFace创建Wizards Creating J ... -
RCP程序怎样实现自适应分辩率最大化(增加版)
2007-05-15 14:02 1268交口称赞在BLOG中提到了一种让RCP最大化的方法: 在App ... -
如何在ViewPart上添加ViewToolBar
2007-05-15 17:58 3745ViewToolBar其实就是Actions。在ViewPar ... -
郁闷的Perspective
2007-05-15 18:11 888下午正式开始RCP开发,于是乎轻车熟路的开始打基础框架。 ... -
读jlibrary代码的部分疑问,希望有人解答~
2007-05-18 10:30 1273昨天在Bolg中贴出来一个很不错的RCP项目http://jl ... -
简单应用Maven2
2007-05-18 13:54 838Maven2对项目的管理确实可以说是无微不至的,而且给出了大量 ... -
介绍一个好站
2007-05-20 10:42 756http://www.krugle.com/代码搜索工具,使用 ... -
Eclipse3.3m7 VS Eclipse3.2.2
2007-05-22 08:37 1011Eclipse3.3m7 VS Eclipse3.2.2没有深 ... -
西安java用户群成立~_~
2007-05-23 15:58 757西安java用户群,感谢dudu,为我们开通团队,所有西安ja ... -
RCP的异常
2007-05-25 12:53 799上次的一篇文章问到为什么TreeViewer没有刷新, ... -
正在规划一个Eclipse上看RSS的Plugin
2007-06-04 08:50 911目前正在规划阶段,初步想法是,实现一个周博通的EclipseP ... -
初识DB4O
2007-06-10 11:15 716DB4O? 新出的OODBMS~取谐音DB fo ... -
如何用WebStart部署RCP应用程序?
2007-06-11 17:19 836上传一份同事写的预研文档:WebStartToRCP.doc ... -
RCP开发者的好去处之ICON系列(持续更新中... ...)
2007-06-11 20:49 835为了找个合适的图片是不是头大的不像样子了?OK,我现在 ... -
庆祝一下~RCP开发者的福音到了!
2007-06-14 22:04 788今天在Eclipse站上学习如何使用Maven2管理Eclip ... -
再次理解Eclipse的类加载机制
2007-06-18 15:13 1024今天在写RCP的基础运行插件的时候,发现一个非常有意思的问题: ... -
插件开发依赖其他插件时一定要注意!
2007-06-19 14:18 2122插件开发依赖其他插件时,我们要在plugin.xml的depe ... -
RCP实践之软件架构
2007-06-19 21:22 648RCP还是新兴的东西,大家都是用它做做小东东,所以在网 ... -
RCP实践之第三方JAR包
2007-06-20 21:43 3142感谢大家对上一篇文章的拍砖,引起的反响不小,目的达到了 ... -
我们是幸福的Blogger~
2007-06-24 20:23 685因为有DUDU~所以我们一群幸福的Blogger。 ...
相关推荐
基于RCP封装的芯片模型电热模拟.pdf
RCP数据模型验证框架RCP数据模型验证框架RCP数据模型验证框架
《Eclipse RCP与Spring OSGi:技术详解与最佳实践》由资源的Eclipse专家亲自执笔,并得到了Eclipse官方技术社区的强烈推荐,权威性毋庸置疑!内容全面,系统讲解了利用Eclipse RCP和Spring OSGi开发大规模Java应用的...
RCP&OSGI;
RCP在线升级RCP在线升级RCP在线升级RCP在线升级RCP在线升级
基于java拓扑模型和RCP的GIS平台研究
1.2.Eclipse RCP 建设风格——插件,扩展和扩展点 1 2.创建你的第一个RCP程序 1 2.1.创建一个RCP程序 2 2.2.启动你的RCP程序 5 2.3.应用程序VS 产品 6 3.应用程序里的插件ID 7 4.Actions的用法(菜单和...
RCP导出EXE 老大难问题。 RCp 程序导出步骤,保证能够导出~
eclipse rcp应用系统开发方法与实践 随书源代码
eclipse rcp应用系统开发方法与实践 随书源代码
Eclipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作. ...
RCP 常见的扩展点指南 RCP最精华的部分之一,详细分析了RCP如何建立扩展点的。
clipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作 ...
有关rcp的内容 是rcp入门的好帮手,rcp自学的好帮手
Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT
Eclipse RCP富客户端平台,基于Eclipse开发的。
RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体
RCP系统使用的弹出式日期控件,可切换上月下月,前一年后一年,可选择年、月
RCP源码例子 RCP源码例子 RCP源码例子
EclipseRcp 例子程序