to:jerrying

你这里提的关于'when'的问题,是不是应该和工作流结合起来

When:(State,Phase)对于复杂系统,每个对象都有一个生命周期,授权时可能要求区别对待。比如:一则新闻的生命周期可能有三个阶段:起草、审批、发布。在不同的阶段可以为不同的Who有不同的授权。

由于我现在正在做毕业设计》》就是有关权限系统的设计的课题!
我希望大家帮助我呀!
可以与工作流结合,也可以不是工作流结合。一个业务对象总归有其发展历程,就象一个软件有其需求收集、需求分析、设计、实现、测试、维护、退役等阶段一样,在不同的阶段可以有不同的权限分配。如果系统中没有工作流,可以手动的通过系统提供的UI设置其不同阶段。当然,要定义好从一个阶段到别一个阶段转换的业务条件。如果系统中有工作流,可以通过工作流直接驱动业务对象在不同阶段中发展,完成了这个工作流,也就完成了发生发展的各阶段。工作流只不过使这一发生发展过程的某些环节相对的自动化了一些,它只不过减少了非增值劳动,它代替不了人脑劳动。所以说,权限与工作流可以不直接发生关系。
to: jerrying

谢谢你的回复,很有价值啊。偶的砖头抛出去,收获到玉了。 :)

你的文章很精练,我还要细读细思考一阵子,先回复,以示感谢。

谢谢。你的文章给我很大的帮助,不过如果有个具体的例子会更好^_^....
各位的高论真的收益非浅,不过暂时还没全理解

有几点想说,也不知道对错。
感觉大家说的都是授权,而没设计到认证,这也好,不过xn_jin提到的RBAC是个成型的东西么?

另外大家都谈自己的想法,除了一个pow2acl之外什么也没给,有没有具体些的东西。

JAAS谁熟悉,用他做可以么??

本人也想做个比较通用的 验证及权限自动管理系统 ,感觉验证可以用公用的模块做,而权限则可以通过administrator这个role进行不同环境下的选择,不过这样会出现一个权利集中管理的情况,但我想这样能更加简单些吧

如果说的不对,大家就不要利用宝贵的时间做答了,等我再研究研究的,要是你象批评,我还是很愿意听的,最好再有些好的建议。

先占位!

OpenSource 系统,名为 Power2Acl
i can't find it ! where?
看了这么多,头比较大。有些问题,大家比较清楚了,就没有必要再花费时间讨论。针对一些疑问,可以专题讨论。希望斑竹能够进行归纳、整理成一份完整的权限解决方案(当然会有一些疑问,没有关系,针对疑问的地方再讨论嘛!没有疑问的就可以沉淀下来)。这样会有一个相对的、阶段性的成果。大家以为如何?
公司的工作流系统中用户权限部分的设计想借鉴基于角色的权限管理,但是实现起来有困难,就演变成为以下这个样子。系统分为这几个模块:部门管理,用户管理,功能管理,角色授权,角色分配。通过角色分配模块可以将角色赋给人员,部门。当将角色赋予给部门的时候,该部门的人员都被赋予了该角色。另外在此对角色采用精细粒度的控制,可以直接将角色赋给人员。同时我们也可以让用户定义了一个规则,如当给部门赋予角色时与原来的用户的角色相冲突时,采用的策略由用户自己选择,提供并、交两种角色设置策略。角色的权限(功能)可以包括查看、管理,规划,申请等等。通过角色授权模块把角色映射为权限的集合。
如上实现的是一个简单的用户权限管理系统,应该可以应付管理需要。但是缺陷也有不少。

我现在在看基于角色的权限管理(RBAC)的文献,希望下一帖理一个思路给大家帮我看一下

不知道这个讨论是否还在进行呢?
很有分量的帖子,大致综合了一下大家的说法,澄清一下自己的思路。

安全管理有user、role、group、permission(HOW WHAT)几个概念(暂时不提及whick),user和role是多对多的关系。group和user是多对多的关系。group单纯是对用户从组织机构的角度进行分组,而role指一组用户和一组权限。group概念的引入主要是为了辅助解决whick的问题。permission是指对what(类,不是which实例)进行how操作的一个具体定义。

几点疑问:
1.group的引入就是为了解决whick的问题,但是group本身是有层次的,比如一个单位组织机构如下:
单位
a部
a1组
用户1
用户2
a2组
用户3
b部
b1组
b2组
对某些类型的数据要求是本大部门的人都可修改(比如数据owner是用户1,那么a部人都可以修改),而对某些数据是本小部门的人都可以修改(比如数据owner是用户1,那么a1组人都可以修改),这些问题我想在程序中都很难写成通用的东西,我想程序里部应该把groupid写死,但有的时候还必须写死。而且严重的问题是组织机构发生变化,程序的维护性就是个问题,就是说程序不能依赖动态的数据。
2.
还有rbac中提出的role可以继承的概念在实际系统中很实用,但是用关系数据库却很难表达,因为一个role可能有两个父role。

普通职员

开发部 工程部

老总
很简单的例子,老总具有开发部和工程部的全部权限,这样的例子在数据库中就很难表达,只能把开发部和工程部的权限给老总挨个重新设一次。

经过痛苦的思考和对自己以前做过项目的总结,提一点自己的想法:
在权限系统中,user不用详细描述了,基本是通用的,
role可以理解为是岗位,举个软件公司的例子,开发部经理和软件部经理的role是一样的,role直观上理解是职权的意思,可以把role做成一颗树,表达一种职权领导关系,即父role直接领导子role,所以上面的例子,总经理这个role应该是root,role与user是多对多的关系。(一个人可以身兼数职)。
group可以理解为是组织机构,还是上面的例子,软件公司下面有开发部和工程部,可以把group做成一颗树,表达一种组织机构隶属关系,group与user也是多对多的关系(符合国情:-)....)
role与group的引入只是说明user与user之间的两种系统中最常见的关系。
一个复杂的权限控制可能是很一个复杂的策略,不能通过单单对角色或者group的授权来完成,应该是一个if..else..的过程,输入参数有which(实例)的id和ower_user_id(which的creator),当前的用户id,返回结果是boolean,决定who(当前的用户)对当前的which是否有how的权限。在策略执行的过程当中,会根据输入参数以及上面提到的人和人之间的最基本的关系:role和group来进行一系列的判断,当然在策略执行过程当中还会设计到业务逻辑方面的信息,比如针对某一个what的数据(what是一类数据,如订单的所有数据),可能会根据某一些条件,在策略执行过程中分别选择不同的流程分支,如2000前的订单数据和之后的数据有着不同的权限控制策略,需要在策略执行过程当中进行分支处理,这样其实也就解决了when(工作流)的问题,因为when的区分最终都会体现在which的具体数据中的,比如领导签字前和领导签字后的数据。
实施:
用关系数据库表达如下:
groups:groupid pargroupid groupname
roles:roleid superroleid rolename
users: userid username
group_user : groupid userid
role_user : roleid userid
在what的角度定义策略执行脚本,拿order为例子:
if (order.ordertime > 2000.09.08) {
if (owner_user_id.groupid == 3) {
.....
return true;
}
else {
.....
return false;
}
}
else
{
.....
return false;
}
存在的问题:没有java好像没有发现有类似delphi中的dreamer script editor这样强大的控件:-)
以上只是个人想法,欢迎大家交流和批评指正。