??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
有这L需求:OA pȝ中的公文审批共有六个 stepQ采用单点(不牵?split ?joinQ逐审核方式Q不同角色登陆时Q由同一面处理Qؓ了便于收发文l计Q必ȝ道下一个接收h是哪个?BR>
׃在触发当?action 的同时就要设|好下一接收者,遂需要引q新的协作表。当 action 时要调用另外?save ҎQ而这一q程当然不能在表现层q行。最开始的做法是用一个辅?service 来取出每?action 的下一接收者,如下Q?/P>
public List getLeader(int type,int companyId) {
switch (type) {
case 1:
return docSendDao.getThisFaculty(companyId);
case 2:
return docSendDao.getOffice();
case 3:
return docSendDao.getSecGroup();
case 4:
return docSendDao.getOfficeLead();
case 5:
return docSendDao.getSecFaculty();
default :
return new ArrayList();
}
}
q种做法在开发的前期q觉得不错,随着需求的q一步详l,发现当新增、修ҎE时Q也许我们要在这?service 中满山遍野的扑֯到底代码在哪里。更p糕的是产品提交用户后,用户不会pq么大的耐心让你q样l护。在l过短暂的思考后Q决定利?OSWorkflow ?FunctionProvider 接口?script 做文章?BR>
一个比较成熟的x是(如各位有更好的方案不妨交)Q每个流E都可能面修改Q那把程的每?action 要做的事抽取出来Q这样修改v来相对独立,比如要把下一默认接收者改成其他hQ另一个目的是快速响应用户对新流E的需求,在提出需求后Q生成相应的程文g及每?action 要做的事Q提交到服务器,重启可以用了,而不是在已有代码基础上新增。这里的“每?action 要做的事”就?OSWorkflow ?FunctionProvider 接口Q实现这个接口,可以ؓ所Ʋؓ了?BR>
代码片断如下Q?BR>
程定义 FacultyLea public class FacultyLea implements FunctionProvider{ |
function 只是 OSWorkflow 为我们提供众多功能中的一个,如果可能Q我会把另外的用心得写出来?/P>
h意!引用、{贴本文应注明原作者:Rosen Jiang 以及出处Q?/FONT>http://www.tkk7.com/rosen
首先Q自q立安装它们,然后开始我们的 shark 学习Q?br />
获得 Shark
我个人的安装方式是把所有的源文件拷贝到 C:\dev\Shark 目录下,最后的输出路径?C:\Shark。你也可以自己放在Q何地方,不过要调整以下命令?br />
首先下蝲 Shark 1.0 http://forge.objectweb.org/project/showfiles.php?group_id=74&release_id=512
对于 Windows pȝQ我下蝲 zip 文gq解包到 C:\dev\Shark 目录?br />
如果你想获取 CVS Q?a >http://forge.objectweb.org/scm/?group_id=74Q?
上的版本,则命令说明如?
通过使用下面的命令集Q你可以?anonymous ?shark ?cvs 库取C码。下面的 modulename 指你惌 checkout 的模块名Uͼ如果你不知道模块名称Q请???代替?/p>
如果有提C求输入口令,?enter 可以了?/p>
cvs -d:pserver:anonymous@cvs.forge.objectweb.org:/cvsroot/shark login
cvs -z3 -d:pserver:anonymous@cvs.forge.objectweb.org:/cvsroot/shark co modulename
在?CVS 的情况下Q我?/dev/Shark 作ؓ CVS 根目录?br />
~??/strong>
切换?C:\dev\Shark 目录。运行下列命令:
configure -help
你会得到下面的输?
Parameters value for using with configure.bat :
configure - Make build.properties file with default values
configure -help - Display this screen
configure [-jdkhome jdk_home_dir] [-instdir installdir] -writes proper parameters to the build.properties file
Examples :
configure -jdkhome c:/j2sdk1.4.1 -instdir C:/Shark-1.0
有一?*nix shell 脚本可以做同L事情。对我来说用q个更简单,我不需要进?jdkhome 讄Q因为我?JAVA_HOME 已经讄好了Q我的安装目录是 c:/SharkQ下面是我用的命oQ?/p>
configure -instdir c:/Shark
q个命o实际上是?build.properties 文g中填充属性字D,我的文g是如下:
version=1.0
version_release=beta2
version_build=13
jdk_dir=C:/j2sdk1.4.2_04
install_dir=C:/Shark
build_debug=on
现在准备开始编译了。编译?antQ但你应该用已经提供?make file。用帮助选项来查看到底有哪些选项可用Q?br />
make –help
大部分的选项要求我们必须先完全构建。当Ӟ也可以用 shell 脚本来完成这个Q务。我们用下面的命令来完全构徏Q可能要Ҏ_?br />
make buildAll
执行上述命oQant 会构建所有的参数。凭借少许运气,׃利完成。如何处理构Z的问题超Z本文的范畴。最后,把这些前期准备好的原材料Q文档,工具{等打包Q再装蝲C前指定的安装路径?br />
make install
该命令会l装Q拷贝)文gC的安装\径(我的?C:\SharkQ?br />
快速测?/strong>
Z快速测试,我们运行默认配|的 Shark 理E序?br />
在安装目录中Q通常有个叫做 runsa.bat 的文件。运行该文g。Shark 理E序QswingQ将启动Q开始向你询问用户名和密码了Q分别是 "admin" ?"enhydra"。如果验证通过Q将会马上证明构建是成功的?br />
TODOQ详情请链接?Enhydra Shark 理文档
配置 Shark
下面Q我们开始配|?Shark
修改 Shark.conf
首先Q在 Shark 路径中找到名?Shark.conf 的文件。用你喜Ƣ的~辑器打开它,W一个参数是Q?br />
enginename=Shark
我们留下这一主题。正如前面笔记所提到的,虚拟机和数据库的不同导致配|的差异。对于初ơ测试,我们不用改变参数倹{请注意被注释了?HypersonicSQL 驱动信息QHSQL 是运?Shark 的默认数据库Q由?Shark 不能q行在多数据库^CQ我们配|ؓ MySQL?br />
# HypersonicSQL
#DatabaseManager.DB.sharkdb.JdbcDriver="org.hsqldb.jdbcDriver"
#DatabaseManager.DB.sharkdb.Connection.Url="jdbc:hsqldb:C:/Shark/db/hsql/hsql"
未注释的 MySQL 部分Q?/p>
# MySQL
DatabaseManager.DB.sharkdb.JdbcDriver="org.gjt.mm.mysql.Driver"
DatabaseManager.DB.sharkdb.Connection.Url="jdbc:mysql://localhost/shark"
h意,q里我还是完全用默认配置。该配置表明数据库是在本地机器上Q用户名/密码使用 MySQL 默认?"sa" ?""。如果这U配|不适合你,你完全可以修改它?br />
#
# Default cache configuration
#
DatabaseManager.defaults.cache.maxCacheSize=0
DatabaseManager.defaults.cache.maxSimpleCacheSize=0
DatabaseManager.defaults.cache.maxComplexCacheSize=0
DatabaseManager.defaults.cache.reserveFactor=0.1
在这个部分,是了解我如何使用 Shark 的好途径Q除非你?CORBA 通讯Q否则应用程序将直接与数据库交互。这些都不是 Shark 服务器代码。所以如果你有多个客LQ它们都需要与数据库直接交互。由于无法更新多个客L的缓存,所以我关闭了缓存?br />
LRU ~存也应该被关闭Q?br />
#=============================================================================
# Default cache is LRU
#
#-----------------------------------------------------------------------------
# Cache defaults
#
#CacheManagerClassName=org.enhydra.shark.caching.LRUCacheMgr
好了Q目的达刎ͼ保存后关闭该文g?br />
创徏数据?/strong>
现在安装 MySQLQ创Z个名?"shark" 的数据库。如果你x变名字,需要在 Shark.conf 文g中修Ҏ据库 URL?br />
其次Q编?C:\Shark 目录?recreateDB.bat 文g。注释掉 Hypersonic 部分Q再反注释掉 MySQL 部分?br />
rem HypersonicSQL database
rem rmdir /q /s db\hsql
rem mkdir db\hsql
rem set LOADERJOBXML=sql\hsql\LoaderJob.olj
rem MySQL database
set LOADERJOBXML=sql\mysql\LoaderJob.olj
最后,我们改变执行调用,因ؓ脚本喜欢创徏新窗口,而且在你看见错误信息前就关闭了。像q样修改它:
start "Recreate Database" "C:\j2sdk1.4.2_04\bin\java" -Djava.ext.dirs=lib org.webdocwf.util.loader.Loader -cjs shark/conf %LOADERJOBXML%
修改后:
"C:\j2sdk1.4.2_04\bin\java" -Djava.ext.dirs=lib org.webdocwf.util.loader.Loader -cjs shark/conf %LOADERJOBXML%
当然Q如果你?JDK 和上面的不一PW一部分的引用会不同?br />
保存后关?recreateDB.bat 文gQ再打开 LoaderJob.olj 文g。在我的pȝ中,位置?C:\Shark\sql\mysql\LoaderJob.olj。其实你不需要做什么的Q但应注意连?URL 是否存在Q如果你变更了数据库名,也要在这里修攏V?br />
最后的步骤是拷贝数据库驱动包到 C:\Shark\lib 目录。我使用 MySQLQ所以拷贝相应的 jar 文g?lib 目录?br />
现在q行 recreateDB 脚本。如果没有意外,成功了。如果你发现了错误信息,再ơ运行该脚本。再ơ阅?“快速测试?以确定所有步骤都已完成。你可以同时q行两个一L理E序来测试多客户端环境?/p>
h意!引用、{贴本文应注明原译者:Rosen Jiang 以及出处Q?/font>
http://www.tkk7.com/rosen
]]>
Enhydra Shark 目以一U不同的方式交付了一个工作流服务器?br />
Enhydra Shark 是一个可扩展的工作流引擎框架Q它包括一个完全基?WFMC 规范的标准实玎ͼ它用XPDLQ没有Q何自己新的扩展)作ؓ自n的工作流程定义格式Q用WFMC ?"ToolAgents" API 作ؓpȝzd的服务器端的执行形式?br />
Enhydra JaWE 囑ŞXPDL~辑器可用于?Enhydra Shark 生成 XPDL 程定义Q?br />
ToolAgents 可用?JavaScriptQJDBC 讉KQEJB 讉KQ纯 Java c,CORBA 调用QEMailQWebservice 调用Q等{?..
程与活动实例的存储通过一个可配置的持久化 API 来完成。持久层实现采用的标准是轻量U的Enhydra DODS O/R mapping 工具。更多重量 J2EE EJB 持久层选择Ҏ在下面展C?br />
每个单一构gQ持久层Q事务管理,脚本引擎Q流E库...Q可用于它的标准实现或被目特定模块所扩展/取代?br />
通过q种方式QEnhydra Shark 可作Z个简单的位于servlet ?swing 应用或运行在J2EE 容器Q支持会?bean API 以及用于 EJB 持久化)中的"Java library"QCORBA ORB ?Web 服务来用?br />
工作引擎内ؓ高负载环境下的活动工作流对象提供可配|的 LRU ~存。缓存可在集部|时关闭?
当工作流q行ӞWFMC WDF API 规范用来把 JAWe ~辑器或 selfwritten E序附加在运行期实例信息上,甚至修改实例。用这一ҎQEnhydra Shark支持动态工作流机制Q能修改其自w来支持更复杂的工作环境或l织的异常处理?br />
通常Q基?Swing 的管理GUI可用于管理工作。JMX 扩展和基?HTML 的管理客L也可用于理?br />
其他 API 可用于知识库讉KQ日志,知识库持久化Q事仉知Q以及ؓ转换评估(transition evaluations)设计的脚本引擎适配器?br />
ObjectWeb 工作工作组
2003 q?12 月,新的 ObjectWeb 工作工作组会议首次召开?br />
本次会议的目标是在当?ObjectWeb 工作项目,也就是在 "Enhydra Shark"?COW" ?"Bonita" 之间定可行的协作规则?br />会议达成的共识是Q这些组件的 API 应该遵@各自的标准(WFMCQOMGQBPELQ。这些组件将会是未来独立工作引擎项目的l成部分?br />
所有组件将不会依赖于特定的q行环境QSwingQServletsQJ2EE/EJBQCORBA...Q?br />
要选择一个通用lg模型Q?glue"Q,当前非常可能的徏议是采用 "Fractal"?br /> 新的邮g列表已经建立Q以方便讨论日常工作工作组事宜和支持项目间的合作。该列表可在 http://www.objectweb.org/wws/info/wow 上找到?br /> 其它达成的共识是使用 Enhydra JaWE 作ؓ ZXPDLq行程定义的通用~辑器?/p>
对WFMC WDFQ工作流定义功能Q的研究表明,?API 是否适合为流E和zd实例q行动态修攏V如?WDF 成ؓ API 的首选,JaWE 支持该 API 以在q行期间可以q行囑Ş化观看和实例修改?br />
以下列出了初步确定的lg列表Q?br />
模型?br /> 映射模块Q包括到ToolAgentsQ脚本语a/引擎Q以及参与者(用户和组Q的映射
程和活动实例持久化Q基?Enyhdra DODS, Speedo, EJB's,...Q?br /> 脚本引擎适配?包装器,适用于不同脚本语aQJavaScript, Python,...Q的程转换评估?br /> zd程和活动实例的q行期缓存(Perseus ?Q?br /> 事务理QGOTM ?Q?br /> ToolAgents
分派APIQ用于动态参与者映?br /> 通知 APIQJabber, JMS, ...Q?br /> 日志Q系l日志和理zd日志Q?br /> 截止期(DeadlineQ管理(zd截止期(deadlinesQ? zd持箋旉QdurationsQ? ...Q?br /> 记时器(Quartz, J2EE Timer Services,...Q?br /> 升QEscalationQ?
Enhydra Shark 架构
Ҏ上述已达成共识的SharklgQ当?Enhydra Shark 架构目标如下图所C?br />
h意!引用、{贴本文应注明原译者:Rosen Jiang 以及出处Q?/font>
http://www.tkk7.com/rosen
我知道这文章阅读量很大Q但是请要l{载本文的同志注意一下,本文是我?2005 q中旬在成都麦柯pȝ集成有限公司写的Q作为公司的技术探索ƈ希望应用在公?OA 产品中。请保留原文版权信息 OKQ?/strong>
----------------------------------------------------------------------------------------------
?a
本文没有抛出可运行的范例Q仅仅是E序片断而已Q不q在 OSWorkflow ?Wiki 上,Quake Wang 已把官方入门教程完整地翻译成中文了,有兴的读者可去阅诅R关?OSWorkflow 更加l节性的内容Q可参考官Ҏ册,怿你在了解了入门教E后Q可L阅读官方手册?br />
OSWorkflow 概念
在商用和开源世界里QOSWorkflow 都不同于q些已有的工作流pȝ。最大不同在?OSWorkflow 有着非常优秀的灵zL。在开始接?OSWorkflow 时可能较难掌握(有h说不适合工作新手入门)Q比如,OSWorkflow 不要求图形化工具来开发工作流Q而推荐手工编?xml 格式的工作流E描q符。它能ؓ应用E序开发者提供集成,也能与现有的代码和数据库q行集成。这一切似乎给正在L快速“即插即用”工作流解决Ҏ的h刉了ȝQ但研究发现Q那些“即插即用”方案也不能在一个成熟的应用E序中提供够的灉|性来实现所有需求?br />
OSWorkflow 优势
OSWorkflow l你l对的灵zL。OSWorkflow 被认为是一U“低U别”工作流实现。与其他工作系l能用图标表现“loops(回\)”和“conditions(条g)”相比,OSWorkflow 只是手工“编?coded)”来实现的。但qƈ不能说实际的代码是需要完全手工编码的Q脚本语a能胜任这U情形。OSWorkflow 不希望一个非技术用户修改工作流E,虽然一些其他工作流pȝ提供了简单的 GUI 用于工作编辑,但像q样改变工作,通常会破坏这些应用。所以,q行工作调整的最佳h选是开发h员,他们知道该怎么改变。不q,在最新的版本中,OSWorkflow 也提供了 GUI 设计器来协助工作的~辑?/p>
OSWorkflow Z有限状态机概念。每?state ?step ID ?status 联合表现Q可单理解ؓ step 及其 status 表示有限状态机?stateQ。一?state 到另一 state ?transition 依赖?action 的发生,在工作流生命期内有至一个或多个zd?state。这些简单概念展C OSWorkflow 引擎的核心思想Qƈ允许一个简?XML 文g解释工作业务流E?/p>
OSWorkflow 核心概念
stepQ步骤)
一?step 是工作流所处的位置。可能从一?step {到另外一?stepQ或者有时候还是停留在一L stepQ。D例来_一?OA pȝ的请假流E,它的 step 名称可能有“本部门审批阶段”,“办公室审批阶段”,“ȝ理审扚wD”等?br />
statusQ状态)
工作?status 是一个用来描q工作流E中具体步骤状态的字符丌ӀOSWorkflow 的有 UnderwayQ进行中Q、QueuedQ等候处理中Q、FinishedQ完成)三种 status?br />
actionQ动作)
action 指定了可能发生在 step 内的转变Q会D step 的变更。在 OA pȝ中,“本部门审批阶段”可能有“拒l”或“批准”两?action。action ?step 之间的关pLQstep 说明“在哪里”,action 说明“可以去哪里”?一?action 典型地由两部分组成:可以执行此动作的 conditionQ条ӞQ以及执行此动作?resultQ结果)?br />
conditionQ条Ӟ
cM于逻辑判断Q可包含“AND”和“OR”逻辑。比如一个请假流E中的“本部门审批阶段”,该阶D利用“AND”逻辑Q判断流E状态是否ؓ{候处理中Q以及审批者是否ؓ本部门主?br />
resultQ结果)
Result 代表指向新的 step 及其 step statusQ也可能q入 split 或?join。Result 分ؓ两种Q?contidional-result Q有条gl果Q,只有条g为真时才使用该结果,?unconditional-resultQ无条gl果Q,当条件不满或没有条件时使用该结果?/p>
split/joinQ分?q接Q?/strong>
OSWorkflow 包用途分析及代码片断
com.opensymphony.workflow.basic
com.opensymphony.workflow.config
com.opensymphony.workflow.ejb
com.opensymphony.workflow.loader
com.opensymphony.workflow.ofbiz
com.opensymphony.workflow.query
public List queryDepAdmin(int userId,int type) {
//构造表辑ּ
for (int i = 0; i < arr.length; i++) {
//查询未完成流~号 com.opensymphony.workflow.spi com.opensymphony.workflow.util ?l?/strong> ׃本h所在公司希望在 OA pȝ中引入工作流引擎Q经q分析决定采?OSWorkflow 引擎。利?OSWorkflowQ已l在pȝ中实C请假条流E原型,该流E结?OA pȝ中已有的 RBAC 模型q行逐审核。我个h认ؓ要用 OSWorkflow 让某个流E跑hg很麻烦,主要是需要扩展和自己实现的太多?br />
程的切分和融合。很单的概念Qsplit 提供多个 resultQjoin 则判断多?current step 的状态,提供一?result?/p>
com.opensymphony.workflow
该包为整?OSWorkflow 引擎提供核心接口。例?com.opensymphony.workflow.Workflow 接口Q可以说Q实际开发中的大部分工作都是围绕该接口展开的,该接口有 BasicWorkflow、EJBWorkflow、OfbizWorkflow 三个实现cR?/p>
该包有两个类QBasicWorkflow ?BasicWorkflowContext。BasicWorkflow 不支持事务,管依赖持久实现Q事务也不能包裹它。BasicWorkflowContext 在实际开发中很少使用?/p>
public void setWorkflow(int userId) {
Workflow workflow = new BasicWorkflow(Integer.toString(userId));
}
该包有一个接口和两个该接口的实现cR在 OSWorkflow 2.7 以前Q状态由多个地方的静态字D늻护,q种方式很方便,但是有很多缺陷和U束。最主要的缺Ҏ无法通过不同配置q行多个 OSWorkflow 实例。实现类 DefaultConfiguration 用于一般的配置文g载入。?SpringConfiguration 则是?Spring 容器理配置信息?/p>
public void setConfiguration(SpringConfiguration configuration) {
SpringConfiguration configuration = configuration;
workflow.setConfiguration(configuration);
}
该包有两个接?WorkflowHome ?WorkflowRemote。该包的若干cMQ最重要的是 EJBWorkflowQ该cd BasicWorkflow 的作用一P?OSWorkflow 的核心,q利?EJB 容器理事务Q也作ؓ工作?session bean 的包装器?/p>
该包有若q类Q用得最多的?XxxxDescriptorQ如果在工作引擎运行时需要了解指定的动作、步骤的状态、名字,{信息时Q这些描q符会v到很大作用?/p>
public String findNameByStepId(int stepId,String wfName) {
WorkflowDescriptor wd = workflow.getWorkflowDescriptor(wfName);
StepDescriptor stepDes = wd.getStep(stepId);
return stepDes.getName();
}
OfbizWorkflow ?BasicWorkflow 在很多方面非常相|除了需要调?ofbiz ?TransactionUtil 来包装事务?/p>
该包主要为查询而设计,但不是所有的工作存储都支持查询。通常QHibernate ?JDBC 都支持,而内存工作流存储不支持。值得注意的是 Hibernate 存储不支持合型查询Q例如,一个查询同时包含了 history step 上下文和 current step 上下文)。执行一个查询,需要创?WorkflowExpressionQuery 实例Q接着调用 Workflow 对象?query Ҏ来得到最l查询结果?/p>
int[] arr = getSubPerson(userId,type);
Expression[] expressions = new Expression[1 + arr.length];
Expression expStatus = new FieldExpression(FieldExpression.STATUS,
FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, "Queued");
expressions[0] = expStatus;
Expression expOwner = new FieldExpression(FieldExpression.OWNER,
FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS,
Integer.toString(arr[i]));
expressions[i + 1] = expOwner;
}
List wfIdList = null;
try {
WorkflowExpressionQuery query = new WorkflowExpressionQuery(
new NestedExpression(expressions, NestedExpression.AND));
wfIdList = workflow.query(query);
} catch (Exception e) {
e.printStackTrace();
}
com.opensymphony.workflow.soap
OSWorkflow 通过 SOAP 来支持远端调用。这U调用借助 WebMethods 实现?
该包可以说是 OSWorkflow 与持久层打交道的途径Q如当前工作的实体Q其中包括:EJB、Hibernate、JDBC、Memory、Ofbiz、OJB、Prevayler?/p> HibernateWorkflowEntry hwfe = (HibernateWorkflowEntry) getHibernateTemplate()
.find("from HibernateWorkflowEntry where Id="
+ wfIdList.get(i)).get(0);
该包?OSWorkflow 的工具包Q包括了?BeanShell、BSF、EJB Local、EJB Remote、JNDI 的支持?/p>
另外Q引用一D?Quake Wang 的原话:电子政务/OA 如果要用workflow engine的话QsharkQjbpm 之类的workflow engine有点杀鸡用牛刀的味道。shark ?jbpm 都强q你使用它的用户模型Q怎样把企业现有的用户模型Q包括组l结构)映射q来是很J琐的事情,比如常见?OA 应用中,甌者对应的部门负责Zؓ下一个流E的人工参与者,使用 shark 或?jbpm 都得l一圈,通过现有的h力资源系l,获得用户Q再对应q来。这q仅仅是一个简单的需求,更不用说国内企业千奇百怪的l织l构Q以及各U特D流E,?wfmc 或者其他所谓的 workflow 通用标准d不怎么标准的事情。吃力不讨好。用 osworkflow q种Z状态机?workflow engine 反而会L很多Q而且它也没有你用它的用h型。另外纠正一点:osworkflow 不仅仅支持简单的 BeanShellQ还支持 java classQbsfQejb。如果做电子政务/OA 的话Q觉得目?osworkflow 是最适用?opensource workflow engine?br />
h意!引用、{贴本文应注明原作者:Rosen Jiang 以及出处Q?/font>http://www.tkk7.com/rosen
]]>
讉K控制技术是q国国防部QDepartment of Defense, DoDQ资助的研究和开发成果演变而来的。这一研究D两种基本cd讉K控制的生:自主讉K控制QDiscretionary Access Control, DACQ和强制讉K控制QMandatory Access Control, MACQ。最初的研究和应用主要是Z防止机密信息被未l授权者访问,q期的应用主要是把这些策略应用到为商业领域?/p>
自主讉K控制Q允许把讉K控制权的授予和取消留l个体用h判断。ؓ没有讉K控制权的个体用户授予和废除许可。自主访问控制机制允许用戯授权?br />取消讉K其控制之下的M客体QobjectQ,换句话说Q用户就是他们控制下的客体的拥有者。然而,对于多数l织来说Q最l用户对所讉K的信息没有拥有权。对于这些组l,公司或代理机构是事实上的pȝ客体和处理他们的E序的拥有者。访问优先权受组l控Ӟ而且也常常基于雇员功能而不是数据所有权?/p>
强制讉K控制Q在国国防?Trusted Computer Security Evaluation Criteria (TCSEC) 中定义如下:“一U限制访问客体的手段Q它以包含在q些客体中的信息敏感性和讉Kq些敏感性信息的M的正式授权信息(如清除)为基”?br />
以上讉K控制{略对于处理一些无需保密但又敏感的信息的政府和行业组l的需求ƈ不是特别的适合。在q样的环境下Q安全目标支持生于现有法律、道徯范、规章、或一般惯例的高端l织{略。这些环境通常需要控制个体行为的能力Q而不仅仅是如何根据信息的敏感性ؓ其设|标{从而访问这一信息的个力?br />
什么是Z角色讉K控制QRole-Based Access Control, RBACQ?NIST 有如下定义?br />
讉K是一U利用计机资源d某g事情的的能力Q访问控制是一U手D,通过它这U能力在某些情况下被允许或者受限制Q通常是通过物理上和Zpȝ的控Ӟ。基于计机的访问控制不仅可规定是“谁”或某个操作有权使用特定pȝ资源Q而且也能规定被允许的讉Kcd。这些控制方式可在计机pȝ或者外部设备中实现?br />
基于角色访问控制而言Q访问决{是Z角色的,个体用户是某个组l的一部分。用户具有指z角色Q比如医生、护士、出U뀁经理)。定义角色的q程应该Z对组l运转的d分析Q应该包括来自一个组l中更广范围用户的输入?br />
讉K权按角色名分l,资源的用受限于授权l假定关联角色的个体。例如,在一个医院系l中Q医生角色可能包括进行诊断、开据处斏V指C实验室化验{;而研I员的角色则被限制在攉用于研究的匿名床信息工作上?br />
控制讉K角色的运用可能是一U开发和加强企业Ҏ安全{略Q进行安全管理过E流E化的有效手Dc?br />
用户QUserQ和角色QRoleQ?/font>
用户指访问系l中的资源的MQ一般ؓ人,也可?Agent {智能程序。角色指应用领域内一U权力和责Q的语义综合体Q可以是一个抽象概念,也可以是对应于实际系l中的特定语义体Q比如组l内部的职务{。针对角色属性的不同Q某些模型中角色进一步细分ؓ普通角色和理员角Ԍ可理解ؓ全局角色Q?/p>
许可QPermissionsQ和权限QPermissionQ?/strong>
许可描述了角色对计算源的讉K和操作所h的权限,其反映的是授权的l果。比如授予某个角色对计算源有ȝ权限Q则代表了一个许可的存在Q这个许可表C:角色获取了对计算源的读许可。针Ҏ作来_其描q的是许可和操作之间的一U关联关p,而这层关pd表示了某一角色Ҏ一操作所h的权限及权限状态?/p>
角色和指z(AssignmentQ?/font>
指派包含两个斚wQ用hz֒许可指派。用hz表C的是,用hz特定的角艌Ӏ许可指z表C的是ؓ角色指派计算源的讉K和操作许可?/p>
会话QsessionQ?/font>
会话表示的是用户和角色之间的关系。用hơ必通过建立会话来激z角Ԍ得到相应的访问权限?/p>
角色和角色等U(Role HierarchiesQ?/font>
角色本n仅仅只是一个名词,其本wƈ不能代表权限的大。比如,我们可以定一个“Director”的角色Q也可以定一个“Project Leader”的角色。对于现实中我们来说Q看到这样两个角Ԍ清?DIR 的权限要比一?PL 的权限别高。但是对计算机来_q两个角色仅仅是两个“词语”,是等同的。可以采用分{角色Q在角色上实现层ơ化来解册些问题。也可以采用复合角色Q其表示的就是一个角色组的概念)Q对角色实现一定的分组和复合,以便于权限指z。在一?OA 产品中经常出现分{角色?br />
限制QConstraintsQ?/strong>
模型中的职责分离关系QSeparation of DutyQ,用于控制冲突QConflictQ。静态职责分(Static SDQ指定角色的互斥关系Q用于用hzNDc避免同一用户拥有互斥的角艌Ӏ实现简单,角色互斥语义关系清楚Q便于管理不够灵z,不能处理某些实际情况。动态职责分(Dynamic SDQ指定角色的互斥关系Q用于角色激z阶Dc允许同一用户拥有某些互斥的角Ԍ但是不允许该用户同时ȀzM斥的角色。更灉|Q直接与会话挂钩Q适应实际理需要,实现复杂Q不易管理?/p>
参考文?/strong>
《AN INTRODUCTION TO ROLE-BASED ACCESS CONTROL?NIST《工作流授权控制模型》 ?胡长?/p>
《基于角色的权限理lD?俞诗?/p>
最后,感谢徐俊刚博士对本文译提供的指对{ ?
h意!引用、{贴本文应注明原作者:Rosen Jiang 以及出处Q?/font>http://www.tkk7.com/rosen
一个例?/p>
上图是一个接受?FSM 模型Q用来分析单词“nice”。该分析器只接受字符输入Q包?U状态,状态切换由输入的字W驱动。理解v来非常简单,在此不作解释了?/p>
感谢宏云博士Ҏ文翻译提供的指导?br />
h意!引用、{贴本文应注明原作者:Rosen Jiang 以及出处Q?/font>http://www.tkk7.com/rosen