精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-03-27
这样做,单独建立一张共享表,这张表中保存需要设置权限的那张表的 PK 和一个角色 ID。设置共享后,检查这个用户所属的角色是否有访问这条记录的权限,若有则允许访问,否则拒绝访问。这样做只需要连接一张表就可以把真正需要的数据取出来了,不需要取出大量冗余数据后再过滤。
除了这个角色共享表外,你还可以建立其它的共享表,例如组织机构共享表、用户组共享表等等。不过每加一种共享方式就要多连接一张表了。 如果查询结果中只有需要做权限控制的那张表中的字段,没有任何共享表中的字段,应该使用 exists + 子查询来替代表连接,这样可以极大地提高查询的性能。 如果想要把权限控制到字段,无非就是添加更多的共享表而已。不过我们暂时还没有遇到这种苛刻的要求。 |
|
返回顶楼 | |
发表时间:2004-03-27
对于 dlee 提出的解决方案,这样的需求就比较难以满足吧:
只有一个组的用户所创建的记录能够互相读、删、改。 这个组的父组的用户中的某个角色(比如领导)能够读 所有的这些记录,而另外一个角色(比如管理员)能够 删、改这些记录。另外,父组中的另外某个角色(比如 副职领导)只能看到某些子组的用户所创建的记录。 说实话,我头一次听到这个需求的时候都惊呆了。上面 这个例子只是权限控制需求中的一部分而已 还有更多的 更变态的需求 |
|
返回顶楼 | |
发表时间:2004-03-29
其实每一张表都建立相同的字段(例如:departmentID,userID,roleID等)也不是很大的工作量.本人想到一个小办法(以前如果没有ORM的话,可能很烦喔).
写一个基类 public class Basic { private departmentId; private userId; private roleId; get/set... } 然后每一个类都继承它就可以啦(要用HB的第二种或第三种继承模式),然后嘛(还用说吗),嘻嘻,就用HB生成DDL罗,如果要改动的话,只要改动基类就可以啦,再生成.嘻嘻 不过有一个问题就是这样子的话,就不能再继续其它的类啦.烦.. |
|
返回顶楼 | |
发表时间:2004-05-24
类似的这种需求我们以前做Lotus开发的时候,domino本身支持文档级(类似关系数据库的记录)的权限控制,关系数据库处理确实比较麻烦,曾经想模仿Lotus 的权限控制机制实现一个框架,发现效率实在是低所以作罢。
Lotus的权限控制模型大致是这样的,也许有些参考价值:通过数据库级的存取控制列表来控制全局范围的权限,比如×××有权增删改、×××只读,默认用户只读权限、匿名拒绝等,然后通过每个文档(记录)的特殊字段读者字段和作者字段来控制每个文档的权限,配合群组和角色可以很方便的实现上面提到的上级可以查看管理员可以删改等细粒度的权限控制;这个在关系数据库我们可以通过字段来模拟,只不过处理用户组比较麻烦,而且很难通过查询语句来是实现,只能是先查询出记录,然后过滤,遇到大数据量效率就比较低了。 |
|
返回顶楼 | |
发表时间:2004-06-09
Oracle Label Security 可以提供记录级的权限控制, 而且是透明的。当你select时会根据用户权限自动添加where限定条件。可以参考它的实现机制。
http://otn.oracle.com/oramag/oracle/03-jul/o43security.html |
|
返回顶楼 | |