最近看公司的代码,对权限管理颇有兴趣,恰好今天有空,就记录了以下,如果有错误,还望指正

正统表结构:

从图上可以看出,表结构主要有User Role Function 三个表,分别对应用户、角色、功能,通过这三张表完成权限的控制和实现。

User 与 Role 是多对多关系,使用第三方UserRole表来维护
Role 与 Function 同样也是多对多的关系,多个角色对应多个功能(每个模块都有对应的id,功能即模块,即menu),使用第三方表RoleFunction来维护

大概思路:

用户登陆时加载菜单,根据用户查询用户角色,根据用户角色查询用户功能,将查询到一个menu code,然后返回这些menu code

在控制层在根据menu code 获取并加载菜单

但是无法对每个menu 中的按钮权限进行控制(比如添加、删除、审核)

解决办法:在Role和Function的第三方表中插入一列:menu_btn,代表该该角色下的功能拥有什么样的按钮权限

然后查询时,封装一个拥有menu_btn的实体类menu,用来记录权限,如果没有任何button,则不显示任何菜单


项目做法:

表结构:

T_SYS_USER 用户表

T_SYS_ROLE 角色表

T_SYS_USER_ROLE 用户角色关系表

T_SYS_MENU 功能表

T_SYS_ROLE_PRIVILEGE 按钮权限

[关于权限按钮列表]:

系统有固化的权限按钮,新增,修改,删除,查看,审核..

名称对应:ADD_BTN,MOD_BTN,DEL_BTN,VIEW_BTN,AUDIT_BTN…应:ADD_BTN,MOD_BTN,DEL_BTN,VIEW_BTN,AUDIT_BTN…

多个用户对应多个角色 , 使用第三方表T_SYS_USER_ROLE维护


权限管理中的授权问题:

一个用户可以对应多个角色,A角色的操作权限和B角色的操作权限有冲突,那该以谁的为准?

下面有几种解决方案:

  1. 合并权限,将A角色的权限和B角色的权限合并 √
  2. 在视图上给用户选择,让用户可以切换角色,操作麻烦 ×
  3. 如果角色之间有授权冲突,则不允许授权 ×
  4. 允许用户对冲突角色进行授予,让用户在授予权限时,设置角色的优先级,当角色冲突时,以优先级高的角色为准 √

公司代码分析:

    // 定义一个map,用来保存菜单权限 Map<String, MenuPrivilege> ret = new HashMap<String, MenuPrivilege>();// 查询出权限并添加,使用sql直接查询menu,不查role,即不实例化role,即可避免这个问题,但是btns又拥有这个问题,待解决List<SysRolePrivilege> priviletList = sysRolePrivilegeDao.findByUserRolePrivilege(userId);for (SysRolePrivilege rp : priviletList) {  ret.put(rp.getMenuCode(), new MenuPrivilege(rp.getMenuCode(), rp.getMenuBtn()));// 相同的menu code会直接被map的唯一性覆盖}return ret;

问题解决,思路大概是按照解决方案一

新问题: btns问题

A role 对应 A menu - btn_add, btn_query

B role 对应 A menu - btn_add, btn_delete

如果Arole和Brole都赋给User1那么权限以谁的为准?

// todo 貌似是公司代码bug,待考证


代码展示:

项目的权限管理是根据当前用户的类型,决定要显示的菜单 从而实现权限管理的功能

当加载menu时,会在控制层根据当前登陆用户获取菜单:

    /* 功能菜单数据获取 */@RequestMapping("tree")@ResponseBodypublic Object menuTree(HttpServletRequest request, HttpSession session) {...// 从数据库中获取菜单数据List<SysMenu> list = menuService.menusOfUser(session);List<Map<String, String>> ret = new ArrayList<Map<String, String>>();for (SysMenu po : list) {Map<String, String> map = new HashMap<String, String>();map.put("id", po.getMenuCode());map.put("pid", po.getMenuPcode());map.put("name", po.getMenuName());if (po.isLeafYn()) { // 如果为叶子节点map.put("url", "menu/jump/" + po.getMenuCode()); // 点击链接} else {map.put("url", po.getMenuUrl());}ret.add(map);}return ret;   // 这里在mvc配置文件中配置了json转换器,spring mvc会自动帮你将集合转换为json字符串,发送给jsp,使用js进行菜单的显示}
List<SysMenu> list = menuService.menusOfUser(session);

menusOfUser方法:

    @Service("menuService") public class MenuService {public List<SysMenu> menusOfUser(HttpSession session) {SessionUser sessionUser = (SessionUser) session.getAttribute(SessionUser.SESSION_USER_KEY);Assert.notNull(sessionUser, "user information in session cannot be null");// 超级管理员if (SysUser.USER_TYPE_MASTER == sessionUser.getUserType()) {return menuList;}// 其他普通用户Map<String, MenuPrivilege> menus = sessionUser.getPrivilege();// 如果没有权限菜单,返回空if (menus == null || menus.size() == 0) {return new ArrayList<SysMenu>();}List<SysMenu> result = new ArrayList<SysMenu>();for (SysMenu sysMenu : menuList) {if (menus.containsKey(sysMenu.getMenuCode())) {result.add(sysMenu);}}return result;}}

JavaWeb-权限管理相关推荐

  1. JavaWeb权限管理

    权限设计思想:     用户对应角色,中间有个用户角色表,这个表链接两个表,在其中起到了桥梁的作用,使得用户表与角色表中的关系更加的清晰,最终实现了用户--角色之间的多对多.当然,之前有朋友可能直接忽 ...

  2. Javaweb权限管理设计思路

    权限管理业务界面如下: 数据库方面需要建立六张表: 用户表:user(用于存放用户的相关属性) id,登录名,用户姓名... 角色表:role(用于存放角色):roleId,roleName 用户-角 ...

  3. EasyUI+JavaWeb奖助学金管理系统[16]-权限管理功能的开发

    点此查看本系列文章目录.源代码.配套视频教程 本文目录 1. 本章任务 2. 页面布局 3. 加载角色对应的菜单 4. 提交角色菜单信息 5. 小结 1. 本章任务 之前已经实现了登录.项目管理.机构 ...

  4. JAVAWEB开发之权限管理(一)——权限管理详解(权限管理原理以及方案)、不使用权限框架的原始授权方式详解

    知识清单 1.了解基于资源的权限管理方式 2. 掌握权限数据模型 3. 掌握基于url的权限管理(不使用Shiro权限框架的情况下实现权限管理) 4. shiro实现用户认证 5. shiro实现用户 ...

  5. java shirofilter_Spring项目集成ShiroFilter简单实现权限管理

    Shiros是我们开发中常用的用来实现权限控制的一种工具包,它主要有认证.授权.加密.会话管理.与Web集成.缓存等功能.我是从事javaweb工作的,我就经常遇到需要实现权限控制的项目,之前我们都是 ...

  6. 超十万字_超详细SSM整合实践_手动实现权限管理

    SSM整合_基础配置 SSM框架中包含Spring,SpringMVC,Mybatis.而Spring与SpringMVC都是Spring Framework的模块,无需整合.只需将Mybatis与S ...

  7. 宅急送项目的第七天笔记!(JBPM工作流和介绍 -- 权限管理模型)

    一.回顾第一天核心内容  1. JBPM是什么? 为我的项目带来什么?  工作流, 就是将业务流程实现自动化,非人工方式,控制任务的执行 -------- 所有业务流程 执行信息 都可以存放到数据库 ...

  8. 合肥工业大学—SQL Server数据库实验十:用户及其权限管理

    用户及其权限管理 1. 创建登录名Mylog及密码 2. 创建用户user2关联登录名 3. 创建角色role1 4. 对用户user2及角色role1授权 5. 验证用户授权 6. 收回用户权限 1 ...

  9. mongodb权限管理

    说到mongodb就得先谈谈mongodb的用户组,和传统的关系型数据库不一样,mongodb并没有在创建应用时就要求创建权限管理组,所以类似于Robomongo这样的数据库可视化工具在创建conne ...

  10. 一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)

    TZHSWEET:请大家多多反馈问题,我已经在修改中了,已更新版本...... 如果大家遇到数据库附加问题,EF连接字符串问题,请自行配置,如果有bug反馈可以私聊,我的qq:409180955. 项 ...

最新文章

  1. 怎么改善现有网站为xhtml+CSS
  2. python3学习笔记一(标识符、关键字)
  3. smtplib python教程_python使用smtplib模块发送邮件
  4. SAP中ABAP格式与JSON格式互转方法研究
  5. 01_Linux系统系统语言查询,设置Xshell工具,中文显示,测试Xshell中文字符显示,Linux中文显示乱码设置
  6. UNIX(多线程):13---condition_variable、wait、notify_one、notify_all
  7. Flink Checkpoint 问题排查实用指南
  8. 1323. 6 和 9 组成的最大数字
  9. 【报告分享】2019Z世代消费力洞察报告-腾讯.pdf
  10. SQL注入学习part01:(结合sqli-libs学习:1-10关)
  11. PyTorch:距离度量
  12. 初级程序员易踩的 7 大坑!全中!
  13. 只需要这三个步骤让你轻松搞定Maya中贴hdr贴图
  14. Java web video 视频开发
  15. 英特尔芯片漏洞比想象中更严重:控制计算机无需密码
  16. 常用图标(icon)css下载
  17. 服务器挂微信显示登陆异常怎么办,王者荣耀微信大区登录异常怎么办 王者荣耀微信提示网络繁忙/登录失败如何解决...
  18. 河道水面漂浮物垃圾识别监测 yolov7
  19. 法兰盘零件机械加工工艺规程编制及加工右大斜面用铣床专用夹具设计
  20. 工程机械的深度学习和计算机视觉算法相关论文简介

热门文章

  1. 微信小程序2021年经典面试题总结
  2. x264 源码 mv_range me_range与cost_mv 缓存
  3. C语言_相邻输入之间用空格给数组赋值
  4. 浮躁的过去,开启的项目管理之路(二)
  5. vue中使用图像编辑器tui-image-editor(一)
  6. 金山词霸2003闪烁问题。
  7. Vivado如何使用Chipscope
  8. Spring基础框架结构
  9. linux下重启php服务
  10. 【暗战】1999年杜琪峰指导上映的电影