shiro对细粒度的数据权限的控制

大王龙 发布于 2014/08/19 17:50
阅读 21K+
收藏 2

MySQL连接为什么挂死了?别踩坑!>>>

本人没用过Shiro,也没用过任何权限框架。目前项目中的权限都是查询数据中权限表来判断的。所以我不知道Shiro是否能满足我的需求,各位用过的兄弟还请指教。

本人理解的权限分为操作权限和数据权限,操作权限主要是界面上的菜单、按钮等,数据权限是直接针对数据增删该查。

举个例子:
比如有一个员工管理模块,在系统界面上首先一级菜单中 有一个 “员工管理” 的菜单,点击这个菜单进去管理界面。管理界面上面一排按钮,下面一个员工表格。按钮比如有:新增,修改,删除,导入。

现在假设一个用户登录来维护员工,可能产生的鉴权操作有:
1. 当一个用户登录系统,首先需要根据权限加载他能看到的菜单
2. 点击“员工管理”菜单后,加载该用户有权利的按钮以及能看到的员工(例如这个用户是一个分部门的管理员,就应该只能对这个部门下的员工进行维护)
3. 新增、删除、更改员工的时候需要判断是否具有相应数据权限

权限归类:
上面所述的例子中属于操作权限的有:按钮新增,修改,删除,导入;属于数据权限的有:员工的增、删、改、查。

目前我们的做法是:数据库中有角色表、权限表,给角色授予菜单的操作权限、菜单下按钮的操作权限、机构的机构表增删改查的数据权限、员工表增删改查数据权限的权限,这些权限都存在于权限表中。

当用户登录界面时先根据菜单权限加载菜单,然后根据按钮权限灰化或隐藏按钮,然后根据机构权限获取有权限的员工,点击新增后保存新增记录时,还会检查有没有员工的新增的数据权限。

这个过程的所有的鉴权都是直接查库或者硬编码的。部门代码大致如下:
根据菜单权限加载菜单:menuService.getMenus(User user)
按钮权限加载按钮:menuService.getButtons(User user, Menu menu)
机构权限获取有权限的员工:employeeService.getEmplyees(User user) 通过用户角色,通过角色获取单位权限,通过单位权限获取员工(其实这个过程我们在用户登录的时候会先计算一遍,最后直接获取员工的权限就行了)
新增员工:判断是否对员工表有新增权限 
public Employee addEmployee(User user, Employee e){
    boolean b = permissionService.hasPermission(user, 'T_Employee', 'insert');
    if (b) {
        employeeService.insert(e);
    }
}


说了这么多,也不知道说的是否清楚,目前看了不少shiro的例子,发现都是对操作权限的控制,并没有对数据权限的控制,比如能只能看到该部门下的员工的控制。






加载中
0
酷酷的就
酷酷的就
一般情况下就是对操作的控制,  对于数据的控制还是建议写自己的代码完成
0
小99
小99
对数据控制还是用SQL控制吧
0
e
edison-k
权限不用在service中判断吧,这样相当于没有用到shiro,而shiro也是通过一条过滤链来鉴权的。
0
留给明天
留给明天

赞一个,不知道shiro能不能实现

0
-
-_____-

安全能实现 看来都没仔细研究过

0
白菜粉条炖猪蹄儿

操作权限都可以实现。但是数据范围的权限应该自己写相关的sql吧。

0
zhennann
zhennann

CabloyJS对数据权限控制的实现策略值得参考:概念简洁,开发方便

https://cabloy.com/zh-cn/articles/535f42e8fb8c487fb33b88c9a9e56a7e.html

 

返回顶部
顶部