最近在研究数据级别的权限过滤,但是试了好多种方式,自己想想感觉又行不通,有做过这方面的大神么,一块讨论下,给点思路。
首先说下要实现的功能:(列字段暂不考虑)
其实说白了就两个问题,
第一,如何配置
第二,如何拼接sql语句
第一步就是要实现根据不同的角色的配置查询不同的表记录。
那么首先就要考虑,如何配置,那么配置当然是配置条件了,例如org_no='.....'
但是有的表不一定是按照单位排序,也可能是按照其他排序,
之前可能有想过将表结构映射到前台做一个功能来存储,但是后来又想有的查询可能是多张表,这下就不好办了
那么第二部就要考虑如何来实现sql语句的条件拼接,首先想到的就是spring后拦截,
但是实际上查询出来的东西再过滤一遍,感觉这种方式不是特别好
再一个就是写一个公共方法,返回一个where条件后语句,然后再拼sql语句的后面加上这个方法。
目前能想到的就这么多了,大家有做过这方面的经验么,分享讨论下。。。
------解决方案--------------------
楼主这个不就是条件的值是固定的,也就是规定了这个用户的筛选条件值必须是这个。可以把用户和查询表的固定条件值放到xml中,楼主可以在数据访问层做拦截,这个可以借鉴hibernate的hql转成sql的实现,在sql要执行前要对sql进行分析,可以用indexof的方式取出from 后面时候有xml里面配置的特殊查询表有用到的就在where条件后面添加上其在xml里面的固定筛选条件
------解决方案--------------------
楼主这个就是菜单的权限吧,每个角色的到菜单里面看到的数据都是不一样的,其实不管哪个用户进这个菜单其对应的sql已经是写好的了,只是要根据不同的角色权限加上特定的筛选条件是这样吗
------解决方案--------------------
楼上给的都是 rbac 了,这个适用于等级权限系统。数据级的话,rbac 的粒度不行的。
可以考虑范围限制权限系统。
------解决方案--------------------
可以参考 Linux 文件权限系统
------解决方案--------------------
建立一张动作表,再建一张角色动作表。动作表包括你先要用户所能控制的动作
然后,再建一章角色动作表,就是角色id和角色下有那些动作id,多个动作用字符串拼接(1,4,7,9)
然后用户每次登录后根据用户ID查询有那些角色,再通过角色id操作下角色动作表,根据动作id将所以的动作分割出,
再来查询动作表,装入List容器,如果有模块的话,一般是角色下有多个模块,模块下有多个动作。这样来操作
你最后建个模块表,一个区域一个模块,比如书,游客只能看书,管理者可以上传,修改,删除。
看书是个模块,下面有多个动作,
最好的方案是,一种资源一个模块,模块下有多个动作,用户操作角色,角色操拥有模块,模块拥有动作。
------解决方案--------------------
用户通过修改模块动作表,来实现权限的控制,没有的动作,就没有操作功能。
------解决方案--------------------
动作副表结构 动作附表id,主动作表id,动作名称。
用户动作附表,用户id,动作表id,拥有的附表动作id;
比如你进入编辑书本页面时,一般是点击进入书本编辑时,会有动作编辑id,和用户id吧,通过操作用户动作附表,来实现一些个别用户对资源特别处理。
至于其它功能,想要特别处理就加,不要特别处理的可以不加。在角色模块付权的时候,麻烦点。
后台SQL,你是单表操作,不需要拼SQL啊。