浅析Spring 权限管理的实现

来源:互联网 发布:免费超市积分软件 编辑:程序博客网 时间:2024/05/21 06:38

一、前言

权限管理在后台管理系统中较为常见,不同的管理员拥有不同的角色,不同的角色拥有不同的权限,不同的权限对应不同的资源。同时一个管理员可以拥有多种角色,一个

角色可以拥有多种权限,一个权限可以拥有多个资源。

二、原理

权限管理一般涉及到用户、角色、资源这三者之间的关系,当用户请求某个资源时,先判断该用户的角色,然后判断请求资源所需的角色,最后把用户角色和资源角色作比

较,如果相等,说明该用户拥有访问该资源的权限,如果用户角色没有一个和该资源角色相等,说明该用户没有访问该资源的权限。

三、实现策略

第一种:全部利用配置文件,将用户、权限、菜单、资源(url)硬编码在xml文件中,通过解析xml来判断某个角色是否拥有相关权限。

第二种:全部利用数据库存储,将用户,角色,菜单、资源存储在数据库中,并通过自定义拦截器来判断当前用户角色是否拥有访问权限,具体设计如下:

1、数据库设计(如下图)

① 管理员表 ②角色表 ③菜单表 ④ 管理员角色关联表 ⑤ 角色菜单关联表 ⑥资源表

2、设计思路

为了清晰易懂,我们从管理员操作的基本流程开始设计。(如下图)

上述只是从界面的角度上,区分了不同角色不同权限,如何从安全的角度上真正意义上的权限控制?

首先,将指定角色对应的所有url请求,将这些url存放在一个list当中。

通过管理员登陆,获取相应的角色id,根据角色id获取相应的菜单id,先将菜单所对应的url存到list中(因为菜单也算资源的一种),接着通过菜单id在上述资源表中查出对

应的所有url链接,存放到list中,这些操作在管理员登陆验证成功之后获取,然后将其放入到session中。

配置spring拦截器,拦截所有请求,解析当前的url,与session中list里存放的url进行比对,如果有,则请求继续,没有则返回错误信息,提示权限不够。

如何为一个管理员分配角色?

超级管理员是直接向数据库里添加的,添加一条manager记录,super_manager属性设置为1(代表超级管理员,拥有最高权限),默认为0。为普通管理员分配角色其实

就是向【管理员角色关联表】插入数据,为了避免关联表中数据重复,可以先将该管理员id对应的所有记录删除,再根据分配重新插入即可。

如何为角色分配相应的菜单?

同上,向【角色菜单表】中插入分配的记录即可。避免数据重复,最好采用先删除再插入的规则。

每个菜单上对应的url如何获得?

需要超级管理员手动添加,或者直接操作数据库。


这样,就完成了一个普通的权限管理系统了。