锁定老帖子 主题:关于权限模块设计的一点思考
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-31
hi all: 看见大家提出了很多技术上的解决办法,呵呵,实在忍不住想说两句。我在公司就是维护权限系统的。我个人认为,权限系统控制到url这个粒度就可以了。再往下控制可以交给其它系统来解决。
你能做到多细了?你可以控制按钮,那你需不需要控制链接了?如果不同的角色,看到的下拉列表框不同,你需要控制吗?如果不同的角色需要看到的列表数据也不同,你需不需要控制了?业务需求是多变的,你能满足多少了?再则,你花费80%的精力去提供10%的功能是否值得? |
|
返回顶楼 | |
发表时间:2008-10-31
ACL不就可以了,jdk自带的ACL就很好啊。基本能满足所有的需要
|
|
返回顶楼 | |
发表时间:2008-11-01
有没有哪位做过如下控制? 一、某个岗位的人能看1天的数据,另外一个岗位可以看一个月数据。 二、某个岗位不能看某列的数据,而其他的岗位可以看。 有什么好的解决方案? |
|
返回顶楼 | |
发表时间:2008-11-01
zhajie 写道 有没有哪位做过如下控制? 一、某个岗位的人能看1天的数据,另外一个岗位可以看一个月数据。 二、某个岗位不能看某列的数据,而其他的岗位可以看。 有什么好的解决方案? 这已经是业务了 如果通过报表来展示数据,倒是可以把报表作为授权的对象 |
|
返回顶楼 | |
发表时间:2008-11-01
jander 写道 有这么复杂吗?
简单的权限用RBAC解决。复杂的用ACL解决。 应该是现在的标准吧。 这两个决定了谁有权限,然后用filter(web),aop(Class method)两头一截。ok。 那你是怎么让filter过滤的url和aop拦截的类的方法名做到对应的?专门建表维护这个关系? 比如 "user.do?do=delUser&userid=23" 这个url,aop要拦截的类的方法是Action类的delUser(request,response,...)方法呢还是Service类的delUser(Long id)方法? 我觉得用filter过滤url,同时对界面的按钮和菜单做到所见即所得,不就满足要求了(其他的特殊权限当作业务逻辑),为什么要同时使用filter和aop呢? |
|
返回顶楼 | |
发表时间:2008-11-01
fuwang 写道 jander 写道 有这么复杂吗?
简单的权限用RBAC解决。复杂的用ACL解决。 应该是现在的标准吧。 这两个决定了谁有权限,然后用filter(web),aop(Class method)两头一截。ok。 那你是怎么让filter过滤的url和aop拦截的类的方法名做到对应的?专门建表维护这个关系? 比如 "user.do?do=delUser&userid=23" 这个url,aop要拦截的类的方法是Action类的delUser(request,response,...)方法呢还是Service类的delUser(Long id)方法? 我觉得用filter过滤url,同时对界面的按钮和菜单做到所见即所得,不就满足要求了(其他的特殊权限当作业务逻辑),为什么要同时使用filter和aop呢? 在Service中检查,因为不仅仅考虑web,还要考虑远程调用。 Service中对应的方法: read(Document doc) write(Document doc) aop检查客户是否具有该doc的对应权限。 我在filter仅仅简单的检查客户是否具有某个目录的权限。 |
|
返回顶楼 | |
发表时间:2008-11-01
andy54321 写道 问题二,如果我想权限控制粒度再细一点,比如能够控制到每个页面的每个按钮(操作),这样又该符合设计呢? 整一个标签,用于判断某个用户是否拥有操作某项业务的某个权限<判断用户A是否拥有对模块A的"添加"/"编辑"/"删除"/"查看"的权限>,如果用户拥有就让页面显示相关按钮,如果没有此权限就不让它显示即可<用标签控制>;页面实现如下所示: <compe:competence compValue="" compName="删除" adminsInfo="${adminInfo}" serviceTypeId="${serviceId}"> <a href="javascript:check('delete');">删除</a> </compe:competence> 不知道这样是否可行 |
|
返回顶楼 | |
发表时间:2008-11-01
andy54321 写道 现在在进行系统的权限模块的开发,
已经建立了 user - role - permission 的关联规则,可以实现到url的控制; 问题产生,这样就要依赖url,而且可能会出现同一个url处理类中会包含处理多个业务的方法,这样就不能实现严格控制了,而且可能产生混乱,这是问题一; 问题二,如果我想权限控制粒度再细一点,比如能够控制到每个页面的每个按钮(操作),这样又该符合设计呢? 权限的控制问题应该在大部分的web程序中都会使用到的吧, 还请诸位不吝指点几句 每种类型的项目对权限的粗细粒度要求不一样,想做通用,不太可能。你应该瞄准一个特定领域进行设计。 |
|
返回顶楼 | |
发表时间:2008-11-02
spring security acegi
他有一个jsp标签,有权限就显示,没有权限就不显示, 但有的点繁琐,是非常繁琐,感觉太庞大了,但是可以有 解决你的问题 |
|
返回顶楼 | |
发表时间:2008-11-03
zxming12345 写道 说一下第二个问题:
第二个问题,我们系统中是这样解决的: 操作是树形的,权限也是树形的。 举个例子,url1 是跳转到一个页面,url1可以分配权限。 这个url的页面中,其实也可以通过树形,配置功能点,这些功能点,也有url。 在页面中,写一个permision的tag,页面中的链接,写在这个tag中。这个tag就去功能树上判断当前用户有没有这个url的权限,如果有,这个链接就打出来,如果没有,这个链接就不大出来。 还有,我们系统中,还有对数据库中表和字段的权限设置。 我们需要维护一个数据字典,建表的时候,并不是直接在数据库中建表的,而是通过数据字典这个功能点建表的。 查询的时候,我们通过数据字典,封装了查询,这样在开发查询的时候,可以通过配置得到查询结果,而不用写sql了。比如首先选择查询的表,然后设置表之间的连接关系,然后可以在页面设置查询条件,分组,排序统计,最好向数据库存储一个查询。当调用查询的时候,就可以通过这个查询id 得到查询结果。 我们可以通过数据字典,为每个用户配置每个表和每个字段的权限,当通过查询id得到查询结果的时候,就可以通过权限,判断改用户有没有对这个表的查询权限,如果有,再判断该用户没有对配置的查询的字段的权限,这是,如果一个字段,这个用户没有权限,那么,查询结果中就不包括这个字段,这样就实现了对表、字段的权限。而且简化了开发。因为sql不用写了,在页面配置一个查询就可以了。 我跟根据这个查询,还写了很多标签,比如,通过查询id 就可以利用标签,打印出列表等。列表后面的操作,也是可以配置的。这些操作,当然也会收url权限的控制。 说的很不错,如果关于你的“对数据库中表和字段的权限设置”解释的再详细一点就好了; 按你所说,可以通过配置的形式对查询模块的开发可以做到权限的严格控制,应该可以实现多样化了,不过看了解释有些不是很明白; |
|
返回顶楼 | |