我以前了解过的权限管理,一般都是 用户—角色—资源 ,其中用户表示存储用户信息,角色存储角色信息,资源存储url请求路径,名称==;他们之间都是多对多的关系。
   但是近来接触到一个权限管理是 用户—角色—权限—资源;他们存储的东西都一样,但是多了一个权限表;这个表有什么用?有必要要多写这样的一个表么?    我的想法是,查看一个用户可以请求那些资源,只要查出他拥有那些角色,每个角色可以请求哪些资源,用用户—角色—资源就可以把整个关系表达出来,但是现在加上一个权限表,这个有什么好处???    欢迎各位热烈讨论

解决方案 »

  1.   

    用户:
       用户id .... 用户角色id
    角色:
       角色id 角色名称
    资源:
       资源id 可访问url
    权限:
       角色id 资源id
      

  2.   

    一个用户---》一个(或多个)角色---》一个(或多个)权限----》多个可访问的URL
      

  3.   


    好像有点懂了,可否举一个例子,在下愚钝,望赐教例如有一个用户叫张三,他有2个角色:员工和财务,员工角色可以增删改查考勤记录,财务角色可以增删改查查工资;
    如果你需要对资源修改权限,(员工角色的权限太大)不是只要把 role_resource表的增改删 干掉就行了吗?
      

  4.   

    所以我上面说了,角色-资源 这样的关系,那么角色对资源的权限是固定的,要修改权限就要增加或删除角色,比如现在要增加财务角色的权限,要求财务角色可以增删改查财务预算决算表(统计公司盈亏情况),那么你就要重新建立一个角色,这样的话,你的角色就会越来越多,而且还要修改每个拥有增删改查财务预算决算表权限的用户,给他们增加角色,而如果是 角色-权限-资源 这样的关系,那么只需要修改角色对应的权限就可以了,不需要修改用户增加角色。
    用你的张三的例子来说,如果 角色-资源 的关系,删除权限就是干掉role_resource的记录,如果是增加权限,就要增加 role,增加role_resouce,修改user
    而如果是 角色-权限-资源 的关系,增加删除权限,只需要修改 role_authority (增加或干掉)
      

  5.   

    我感觉不太对啊, 角色-资源 这样的关系,现在财务角色要求增加增删改查财务预算决算表,那只要在role_resource 表中加入增、删、改、查财务预算决算表recourceID就好了啊,不用新增角色如果角色-权限-资源 的关系,权限-资源之间的关系是如何记录一项权限的? 
    例如张三是一个员工,有查询考勤记录的权限  
    如果是用户-角色-资源关系的话  user表记录用户信息,user_role表记录张三userID和员工角色roleID   role表记录角色信息 role_resource表记录员工roleID和rescourceID  resource表记录资源(查询考勤记录的URL)如果是角色-权限-资源 的关系该如何记录?
      

  6.   

    那你的增删改查权限怎么控制的?也就是说你插入一条role_resource记录就包括4种权限,还是分别插入4条记录?比如说说某个角色只拥有增删权限,某个角色只拥有查权限,你打算如何管理?
    如果是角色-权限-资源
    role_authority 记录 roleId和authorityId
    authority_resource 记录 authorityId和resouceId
     
      

  7.   


    分别插入4条记录,来表示增删改查的权限,如果某个角色有4种权限,那么他在role_resource就有4条记录,
    如果某个角色只有查权限,那么他在role_resource就只有1条记录那如果是角色-权限-资源关系的话,某个角色只拥有增删权限,某个角色只拥有查权限是如何存储??
      

  8.   


    如果是用户-角色-资源关系的话 user表记录用户信息,user_role表记录张三userID和员工角色roleID role表记录角色信息 role_resource表记录员工roleID和rescourceID resource表记录资源(查询考勤记录的URL)分别插入4条,那么你的roleId和resourceId怎么作为唯一识别的?也就是哪条记录代表角色拥有增权限?哪条记录代表角色拥有删权限呢?那是不是就需要多个角色了?(因为相同的resourceID,必须roleId不同才能保证唯一识别)
    所以还是离不开权限,在你这种情况下,除了保存roleId和resourceId,还应该保存一个权限值,该值就是角色对应资源的权限,比如查是1,增是2,删是4,改是8,那么拥有增删就是2+4=6,拥有查增就是1+2=3等等(其实就是二进制的方式0代表无权限,1代表有权限,增删查改分别对应二进制不同的位置,当然也可以自己任意设计权限值,只要觉得可以灵活处理就好)如果是角色-权限-资源关系的话,某个角色只拥有增删权限,某个角色只拥有查权限是如何存储??上面说了,在你的情况下可以增加一个权限值来达到权限的控制,那么把这个权限值用表的方式来存储而不是值的方式存储,这就有了 角色-权限-资源 三方关系表,该表保存
    roleId,authorityId和resourceId
    比如张三对应的财务角色,那么就保存
    财务角色ID,权限ID,资源ID其中权限表里保存
    权限ID,对应的权限这样的话,角色-权限-资源 里插入某个角色ID,某个种权限ID,某个资源ID,就能达到某个角色对某种资源拥有某种权限的目的至于这个权限是用值的方式好还是用表的方式,完全取决于项目的具体需求,即得前段时间有人发过帖子问,说用权限值的方式达到了最大上限了,如果再扩展权限值,所以表的方式有时也有一定的方便,不过查询时要多表关联,也会降低一些性能。
      

  9.   


    首先非常感谢你的回答;
    分别插入4条,那么你的roleId和resourceId怎么作为唯一识别的?
    我和你了解的差别可能是对于资源的定义,角色-资源关系里,增删改查对应着4个不同的资源,因为他们的请求路径不一定,所以他们有4个不同的resourceID,所以在在role_resource里roleID+resourceID可以唯一确定一条记录。按你说那种设计,资源的定义应该是对应一个资源,它的增删改查都是对应着同一个资源,例如财务角色有增删改查工资表的权限,那么按你的设计,那么工资表就是一个资源就对应着resource表的一条记录;而按照我的说法,工资表对应4个资源,resource表里面有4条记录,分别是增、删、改、查工资表。不知道我说的是否正确??为我解答了那么多,辛苦你了,结贴时为你追加分数
      

  10.   

    这个就看你的具体业务的逻辑实现了,其实同一个URL,也可以通过判断权限来让页面显示的内容不同,当然,像你这样用不同URL来显示不同的页面也是一种处理方法。所以,对于你的问题但是近来接触到一个权限管理是 用户—角色—权限—资源;他们存储的东西都一样,但是多了一个权限表;这个表有什么用?有必要要多写这样的一个表么?其实只是处理方式的不同而已。