`
Feiing
  • 浏览: 240055 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个可能的列级权限控制方案讨论

阅读更多
最近的项目需要做到列级权限控制,  大意如下

public class DomainObject {
   private String attr1;
   private String attr2;
}


需求是 角色1 可对 attr1  进行读操作, 对 attr2 进行写操作,  而 角色2  对 attr1, attr2 都没有读权限.

目前考虑的方案 : 主要是在 ui 上控制, 如果没有读权限, 则显示空或无权限, 如果只有读权限, 则控制输入框为只读.

实现 : 建一张表用以纪录角色对 DomainObject   各属性的权限,  使用 webwork interceptor  拦截所有页面上的 ww 标签访问,  然后到配置表中查找权限信息,  如果查到匹配,  就将信息记录在一个集合中(类似 fieldError), 不妨称之为 fieldSecurityInfo,   最后更改标签模板,  根据 fieldSecurityInfo 中的信息做相应控制, 感觉大体可行.

目前的问题是 :

1. 如何拦截 <ww:> 标签的访问 ?
2. 只在 ui 上控制是否足够安全? 如果需要后台控制,  觉得难度工作量更大.


有做过类似需求的同学,  请不吝发言 
分享到:
评论
23 楼 xgylog 2006-08-04  
如果建权限表,个人感觉后台实现比较好,通过session bean 和自定义标签,一条sql即可完成,权限表实际起到字典的作用,不过最好给业务管理员留下管理功能,可以灵活的控制各个权限级别访问类型的变更和角色的增加。
22 楼 BirdGu 2006-07-19  
ACL也好,RBCL也好,准确地说都属于访问控制的策略,而不是具体的实现方式。
21 楼 凤舞凰扬 2006-07-18  
引用

我还真没听说过Oracle可以做到一个表中某几行可以由某人修改,另外几行又只能只读什么的,能说清楚点么?
基于行的安全控制,Oracle 早就做到了。http://www.oracle.com/technology/oramag/oracle/03-jul/o43security.html
引用
ACL一般应用于用户数少(相对于权限)的场景,性能好是它的特点
RBAC一般应用于用户多,权限也多的场景,灵活是其主要解决的问题
说大了,世界上权限控制方式只有两种,一种是控制单体数据(怎么叫都好,什么行数据,实例数据都可以),另外一种是控制数据集合的权限.ACL,RBAC和这种划分是没有冲突的.所谓的列数据控制,其实是控制数据集合权限的变形罢了. 在这上面糊涂的人,其实是没有搞清楚自己到底要控制什么罢了.在说明白点,就是上面说的控制数据attr,其实应该控制的是operation(business logic)
说实话,我的确不理解ACL从实现上对基于列的控制有什么作用,如果只是讨论所谓的概念,我也写得很清楚了http://forum.iteye.com/viewtopic.php?t=20586&postdays=0&postorder=asc&start=15。 就是基于ACL也好,基于RBAC也好,说到底只是权限控制的行为方式,而并非怎么去寻找一个更好的思路去实现基于行控制的行为。 如果要把基于属性的控制泛化为operation,基本就没得谈了。
引用
现在一般的Web应用,由于使用Connection Pool,一般数据库用户都使用的同一个。所以依赖数据库的访问控制机制是不行的。

普遍的,全面的属性级访问控制是否有必要?象ACEGI的话也只是支持对象级的访问控制。
那确实,在绝大多数情况,甚至列对象级的控制都是不需要的。不过既然谈到了这个问题,也就是存在了需求。
20 楼 zkj_beyond 2006-07-16  
独狼 写道
引用
如果配置什么的看编程技巧了,我是把这些业务表的列都生成xml,角色和表列的关系也在xml中,启动web服务器时把没个角色 规则实例化成 一个java对象,如果修改角色,只要修改内存中java对象和xml就可以了。
经过实践,比放数据库中简单。

这种方式对维护者就是恶梦啊。。。

我不认为复杂。和你建立权限表一样!可能更简单。

这里我把这个xml当成数据库。你把这个xml转化成表单是如此的容易。
我用xstreame上瘾了。先定义java对象,然后确定xml.

private class RoleMapping{
    private  String role;
    private  String tableName;
    String[] fieldName;
     Boolean[] isReaders;
    Boolean[] isWriters;
    ............................

}
其实控制权限的就这一堆对象,初始化这个对象的是 需要 控制权限的表极其字段。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

不知道大家用过lotus domain开发过OA没有,它的字段控制和楼主的需求类似。
19 楼 独狼 2006-07-15  
引用
如果配置什么的看编程技巧了,我是把这些业务表的列都生成xml,角色和表列的关系也在xml中,启动web服务器时把没个角色 规则实例化成 一个java对象,如果修改角色,只要修改内存中java对象和xml就可以了。
经过实践,比放数据库中简单。

这种方式对维护者就是恶梦啊。。。
18 楼 riss 2006-07-15  
wolfsquare 写道


引用
这个都可以做到行级的访问控制了.

我还真没听说过Oracle可以做到一个表中某几行可以由某人修改,另外几行又只能只读什么的,能说清楚点么?


Oracle高级安全特性中有个"精细存取控制",这是我在&lt;Oracle专家高级编程&gt;中学得,并在实际项目中用到.
Oracle标准版是没有这个特性地!只有企业版的才有!当然标准版了可以通过一个小巧门可以做到.
比较有意思的东西!!!
17 楼 zkj_beyond 2006-07-15  
Feiing 写道

public class DomainObject {
   private String attr1;
   private String attr2;
}


需求是 角色1 可对 attr1  进行读操作, 对 attr2 进行写操作,  而 角色2  对 attr1, attr2 都没有读权限.

我到是不建议把这些放到web层处理,应该放到logic层。
public class Field{
    private String name;
    private  Object value;
    private type class;
    private isRead;
    private isWrite;
    private String role;
}

public class DomainObject  implment IDomain{
   private Field attr1;
   private Field attr2;
}

如果配置什么的看编程技巧了,我是把这些业务表的列都生成xml,角色和表列的关系也在xml中,启动web服务器时把没个角色 规则实例化成 一个java对象,如果修改角色,只要修改内存中java对象和xml就可以了。
经过实践,比放数据库中简单。
16 楼 wolfsquare 2006-07-15  
DS也有适用场景的,在需要使用权限做大量过滤时候就只好抓瞎了,不如SQL连接来得干脆。
15 楼 jini 2006-07-15  
wolfsquare 写道
引用
你們回帖的人 有使用過 DS 做過 Access Control 嗎 ?

老兄,你从哪个星系过来的亚,我们有说到DS吗?


喔 ~ 我只是好奇問問.. 沒有挑釁的意思

因為 討論到 Access Control 的彈性與複雜性 最好還是以 Directory Server 有繼承性的關係會比在資料庫中容易的多..
14 楼 BirdGu 2006-07-14  
现在一般的Web应用,由于使用Connection Pool,一般数据库用户都使用的同一个。所以依赖数据库的访问控制机制是不行的。

普遍的,全面的属性级访问控制是否有必要?象ACEGI的话也只是支持对象级的访问控制。
13 楼 wolfsquare 2006-07-14  
引用
你們回帖的人 有使用過 DS 做過 Access Control 嗎 ?

老兄,你从哪个星系过来的亚,我们有说到DS吗?

引用
这个都可以做到行级的访问控制了.

我还真没听说过Oracle可以做到一个表中某几行可以由某人修改,另外几行又只能只读什么的,能说清楚点么?

回到楼主的问题:
引用
1. 如何拦截 &lt;ww:&gt; 标签的访问 ?
2. 只在 ui 上控制是否足够安全? 如果需要后台控制, 觉得难度工作量更大.

1.为什么不采取安全标签来控制而要拦截 标签访问?
2.前台要控制,后台视安全要求了来决定,仅仅在一两个地方做权限的特殊控制问题不大,难的是整个权限系统设计通用,概念一致,简单,还要容易管理.
12 楼 riss 2006-07-14  
我想这个问题解决本质依赖于数据库
如果使用的是ORACLE数据库考虑使用"精细访问控制"看可不可以,这也许比你的要求做的更好,至少在数据库级你是做不到随便查看,修改,和删除数据了,这得看你如何根据角色来制定策略了.说的对与不对只能作为参考.
我曾经做过这样的东西:根据用户角色,什么样角色可以访问数据库中的什么记录.什么样的角色可以对它进行修改,插入数据(这依赖数据库中指定的策略了).这个都可以做到行级的访问控制了.我目前只知道ORACLE可以做到.其他的不了解.SQL server应该不能这样!呵呵!
11 楼 jini 2006-07-14  
引用

需求是 角色1 可对 attr1 进行读操作, 对 attr2 进行写操作, 而 角色2 对 attr1, attr2 都没有读权限.

這用 aop 的觀念實現一點都不難, 否則利用 SessionBean 設定 method-security 應該是最方便的.

........................................................................
另外, 在 directory server 應該有區分 ACL and ACI

aci 的範例

aci: (target=”“ldap:///$rootSuffix”)
  (targetfilter=(!(objectclass=sunServiceComponent)))
  (targetattr != “userPassword||passwordHistory
   ||passwordExpirationTime||passwordExpWarned||passwordRetryCount
  ||retryCountResetTime||accountUnlockTime||passwordAllowChangeTime”)
  (version 3.0; acl “anonymous access rights”;
   allow (read,search,compare)
   userdn = “ldap:///anyone”; )

根據不同 target, 設定相關的 permissions ( allow/deny ) 以及相關人員,

ACL 在同一個 directoy entry 之中, 僅算是 ACI 的屬性,  通常應用在系統的存取權限控制上..
........................................................................

說真的. 我完全不知道為什麼 method security 會扯到 ACL .

引用

ACL一般应用于用户数少(相对于权限)的场景,性能好是它的特点
RBAC一般应用于用户多,权限也多的场景,灵活是其主要解决的问题


最後, ACL 和 RBAC 也沒什麼直接的關係. ACI 可以設定 DN 為 Role...
"ACL一般应用于用户数少, RBAC一般应用于用户多" 真的是蠻奇怪的觀念的 ...

你們回帖的人 有使用過 DS 做過 Access Control 嗎 ?
10 楼 BirdGu 2006-07-13  
ACL有很多规则组成。每项规则有三个要素:主体(用户),操作的对象(对象,对象的某个属性,或者程序),被授权的操作(读,写,执行等)。

基于行的权限控制也好,基于列的控制权限也好,只是ACL中的操作对象的粒度不同。

在信息安全领域,关于访问控制的理论是很丰富和完备的。但是,现在要完美的实现这些理论却还是很困难的。主要限制就是实现的复杂度以及性能。

所以,根据实际情况,在安全性和性能,复杂度之家折衷考虑吧。
9 楼 wolfsquare 2006-07-13  
ACL一般应用于用户数少(相对于权限)的场景,性能好是它的特点
RBAC一般应用于用户多,权限也多的场景,灵活是其主要解决的问题
说大了,世界上权限控制方式只有两种,一种是控制单体数据(怎么叫都好,什么行数据,实例数据都可以),另外一种是控制数据集合的权限.ACL,RBAC和这种划分是没有冲突的.所谓的列数据控制,其实是控制数据集合权限的变形罢了. 在这上面糊涂的人,其实是没有搞清楚自己到底要控制什么罢了.在说明白点,就是上面说的控制数据attr,其实应该控制的是operation(business logic)
8 楼 凤舞凰扬 2006-07-04  
Feiing 写道
其实这个 列级 权限控制跟 实例级 权限控制很类似,  标准的 实例级 权限控制是采用 ACL 实现,  不过其复杂度和执行效率都令人诟病

      ACL是什么东东?这么牛?我一直思考着基于列的权限控制,复杂度和效率一直是让我不敢着手和思考的原因。
    我曾经做到过数据行的管理与控制,据说Oracle做到行与列的管理控制。
    我曾经尝试想用ValueObject的原理去考量基于列的控制,自今也没有一个可以去实现的方案。
    刚刚查了一下google, ACL 指Access Control List 。是否如楼上所说的?
引用
ACL(access control list)

访问控制表

ACL是存在于计算机中的一张表,它使操作系统明白每个用户对特定系统对象,例如文件目录或单个文件的存取权限。每个对象拥有一个在访问控制表中定义的安全属性。这张表对于每个系统用户有拥有一个访问权限。最一般的访问权限包括读文件(包括所有目录中的文件),写一个或多个文件和执行一个文件(如果它是一个可执行文件或者是程序的时候)。Windows NT,Novell公司的Netware,Digital公司的 OpenVMS和基于UNIX系统是使用这种访问控制表的系统。而此表的实现在各个系统中却不一样。

在Windows NT中,每个系统对象和一个访问控制表相关。每个ACL都有一个或多个访问控制入口,包括用户名或用户组的名称。对于每个用户,组或人物,他们的访问权限在表中的一个位串中记录。一般说来,系统管理员和对象的所有者创建对象的访问控制表。

作为一个一般的例子,试想一个三个用户的操作系统,在其中一个人是程序员,另一个是程序测试员最后一个是系统本身。ACL中的程序对象可能如下所示:

programmer read write execute

tester read execute

system execute

在这个三个入口的ACL中,在读写和执行程序对象前,系统将测试请求者是否有权限提出这一请求。例如,程序测试者有权读程序和运行程序,但无权写程序,或更改程序。
, 但是我看不出,这对基于数据行与数据列的权限控制有任何指导的意义啊?
7 楼 heaven 2006-06-01  
&lt;p&gt;个人认为,当前的需求是做 实例级的访问控制,用acl模型和rbac应该都无所,用acl的话最终要得到当前用户对该实例的访问控制列表,如果用rbac的概念描述就是得到当前ob的ops,其实是一样的,用什么模型取决于当前的安全需求是object central 还是 user central。
    &lt;p&gt;在通常的分层实现的j2ee应用程序中,通常有两个切面可以获得实例
web 层 在进入controller之前, 通过分析request得到当前实例,进行控制,
service层,使用aop通过分析service method的参数得到实例,进行控制。
    &lt;p&gt;大概就是这样思路,具体实现起来有太多的细节需要考虑。
看过很多成功的web应用都是用acl,用rbac的还罕有,见过的rbac大都走了样子,只剩下一个rabc的概念.
6 楼 liuyxit 2006-05-30  
跟我准备做的自定义列表有点相似。

而我的设想是用自定义标签完成。
就我这情况而言,最麻烦又最想解决的是数据量的问题。
而你的权限就用自定义 标签就差不多了。
5 楼 downpour 2006-05-30  
哪能嘎麻烦?映射数据库嘛?如果这些字段都对应于数据库,为什么不对某些字段做一次ORM,对另外一些字段再做一次ORM,这样一来,你的隔离就针对对象了。
4 楼 wainwen 2006-05-30  
Feiing 写道
wainwen 写道
建议先把权限模型确定下来,再考虑如何实现。
ACL = Access Control List,访问控制列表。
另外一个很重要的概念是 RBAC = Role Based Access Contol,可以google一下。
如果对于权限模型经验不多,最好看看相关资料后再确定自己如何设计。个人感觉,权限系统是信息管理系统中非常复杂,也非常容易设计不到位的部分。
下面是一个比较简单的事业部制组织机构及权限模型:
组织结构:建立一颗部门树,部门可以嵌套子部门
职务:建立多种职务,简单系统,职业和部门可以没有关系,比如项目经理,公司所有部门都可以有项目经理的职务
权限:权限和职务关联,比如项目经理可以有以下权限:创建新任务、请假审批等
员工:一个员工,属于一个特定部门,同时可以在一个部门具有多种职务,也可以在多个部门兼任多个职务


你说了这么多,  跟我要做的列级权限控制有什么关系?

抱歉,有些跑题。
我有点印象,好像是前面有贴子提到不太了解ACL,因此多说了几句,呵呵。

相关推荐

    通用权限模块设计与分析

    "通用数据权限管理系统设计.doc"可能关注数据层面的权限控制,如行级权限、列级权限等,确保用户只能查看和操作其被授权的数据。 "1 权限系统范围.doc"和"权限系统概要.doc"可能是对整个权限系统边界和核心功能的...

    ranger-2.0.0-SNAPSHOT-hbase-plugin.tar.gz

    在大数据领域,Apache Ranger作为一个安全管理框架,为Hadoop生态系统提供了全面的数据安全解决方案。Ranger通过提供细粒度的访问控制、审计和策略管理,确保了数据的隐私和安全性。本文将重点讨论Ranger 2.0.0-...

    oracle系统培训课件——资料包(7个ppt)

    - 权限与约束:讲解GRANT、REVOKE命令,以及行级和列级权限控制。 - 视图与同义词:如何创建和使用视图来提供数据访问的安全性,以及同义词在权限管理和简化SQL语句中的应用。 5. **备份与恢复策略** - RMAN...

    postgresql文档fz群.rar

    8. **安全性与权限**:具备精细的权限控制,包括角色管理、表级权限、列级权限和行级安全,确保数据的安全访问。 9. **大数据处理**:PostgreSQL可以通过并行查询、分区表和外部表等功能处理大规模数据,同时支持...

    SQL2022-SSEI-Dev

    由于提供的压缩包只有一个名为 "SQL2022-SSEI-Dev.exe" 的文件,这很可能是安装程序或工具包,用于在开发环境中设置 SQL Server 2022 的 SSEI 特性。 SQL Server 2022 是 Microsoft 提供的企业级数据库管理系统,...

    v9.7_linuxx64_server带许可证

    5. **安全性增强**:包括对行级和列级权限控制的改进,以及更强的加密功能,保护敏感数据安全。 6. **高可用性**:支持各种高可用性解决方案,如镜像、日志传送和故障切换,确保业务连续性。 7. **性能优化**:...

    DB2 V9.5 数据库安全性指南.pdf

    - **动态权限调整**:讨论在运行时动态调整用户或角色权限的方法和技术。 **3. 审计与监控** - **审计记录**:讲解如何配置审计日志来记录关键操作,以及如何分析这些日志以发现潜在的安全威胁。 - **性能监控**...

    refman-5.6-en.pdf

    9. **性能监控**:新的性能模式提供了一个详细的数据库性能视图,帮助管理员识别性能瓶颈。 10. **XML处理**:增强了XML数据类型的支持,包括XML解析、验证和查询功能。 在使用过程中,如果遇到问题,用户可以访问...

    Greenplum 4.3 管理员手册 英文版

    - **模拟行级和列级访问控制**:提供关于如何实现细粒度访问控制的方案。 - **数据加密**:讲解如何对敏感数据进行加密存储。 - **密码加密**:说明如何启用密码加密以增加安全性。 - **时间基认证**:介绍一种基于...

    Greenplum db admin

    - **模拟行级和列级访问控制**:介绍了如何实现更精细的数据访问控制策略。 - **数据加密**:介绍了加密敏感数据的重要性,并指导如何实施。 - **密码加密**:演示了如何加密用户的登录密码。 - **启用 SHA-256 ...

    小布oracleDBA11集

    "小布oracleDBA11集"可能是一个系列教程或学习资源,专门针对Oracle数据库11g版本。Oracle 11g是Oracle公司推出的数据库管理系统的一个重要版本,提供了许多新特性和增强功能,旨在提高性能、可用性和安全性。 1. *...

    24.SQL.Server.数据库设计与管理

    正常化是数据库设计中的一个重要概念,旨在减少数据冗余和提高数据一致性,我们将详细讨论第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及BCNF(巴斯-科德范式)。 接着,我们将学习 SQL Server 的核心功能...

Global site tag (gtag.js) - Google Analytics