这一周,大多数时间 用来做需求分析,细化每个页面需要实现的功能。由于这个项目需要四种身份登录查看,分别是学生,老师,领导,管理员。每个身份登入系统显示得页面都不相同,四个角色分析完成后,统计了一下页面,居然达到40多个。。。数据库中表一共只有六七个,存在多个页面之间数据重复显示得现象。这时候就需要加入权限管理,一个页面,每个人登录进来后只要显示得页面不同即可。

  设计理念参照了RBAC,这里不多详细介绍。核心内容主要为加入了角色的概念,赋予角色一定的权限,再将角色赋给用户,易于扩展和维护。

表结构图

表之前的关联如上图:

下面列出每个表的结构和数据

用户表 user

角色表 role

用户角色关系表 user_role

权限表 power

表中的pid为该权限对应的上一级的权限id

角色权限关系表 role_power

下面为测试权限管理做的demo

注:本项目只能实现二级权限,三级权限以及以下本文中的方法不再适用

展示效果

程序的展示效果是,若登录者是老师时,显示得导航栏数据为

学生登录显示得内容为

项目代码

本项目沿用了之前搭建的SSM框架,配置文件的部分就不再赘述

项目的目录结构如下

实体类

Power.java

  1. package com.sysystem.model.entity;
  2.  
  3. public class Power {
  4.  
  5. private Integer power_id;
  6. private String power_name;
  7. private Integer pid;
  8. private Power prwer;
  9.  
  10. public Power getPrwer() {
  11. return prwer;
  12. }
  13.  
  14. public void setPrwer(Power prwer) {
  15. this.prwer = prwer;
  16. }
  17.  
  18. public Integer getPid() {
  19. return pid;
  20. }
  21.  
  22. public void setPid(Integer pid) {
  23. this.pid = pid;
  24. }
  25.  
  26. public Integer getPower_id() {
  27. return power_id;
  28. }
  29.  
  30. public void setPower_id(Integer power_id) {
  31. this.power_id = power_id;
  32. }
  33.  
  34. public String getPower_name() {
  35. return power_name;
  36. }
  37.  
  38. public void setPower_name(String power_name) {
  39. this.power_name = power_name;
  40. }
  41.  
  42. public Power(Integer power_id, String power_name) {
  43. super();
  44. this.power_id = power_id;
  45. this.power_name = power_name;
  46. }
  47.  
  48. public Power() {
  49.  
  50. }
  51.  
  52. public Power(Integer power_id, String power_name, Integer pid, Power prwer) {
  53. super();
  54. this.power_id = power_id;
  55. this.power_name = power_name;
  56. this.pid = pid;
  57. this.prwer = prwer;
  58. }
  59.  
  60. }

Role.java

  1. package com.sysystem.model.entity;
  2.  
  3. public class Role {
  4. private Integer role_id;
  5. private String role_name;
  6. private String remark;
  7.  
  8. public Integer getRole_id() {
  9. return role_id;
  10. }
  11.  
  12. public void setRole_id(Integer role_id) {
  13. this.role_id = role_id;
  14. }
  15.  
  16. public String getRole_name() {
  17. return role_name;
  18. }
  19.  
  20. public void setRole_name(String role_name) {
  21. this.role_name = role_name;
  22. }
  23.  
  24. public String getRemark() {
  25. return remark;
  26. }
  27.  
  28. public void setRemark(String remark) {
  29. this.remark = remark;
  30. }
  31.  
  32. public Role(Integer role_id, String role_name, String remark) {
  33. super();
  34. this.role_id = role_id;
  35. this.role_name = role_name;
  36. this.remark = remark;
  37. }
  38.  
  39. public Role(String role_name, String remark) {
  40. super();
  41. this.role_name = role_name;
  42. this.remark = remark;
  43. }
  44.  
  45. }

RoleAndPower.java

  1. package com.sysystem.model.entity;
  2.  
  3. public class RoleAndPower {
  4. private Role role;
  5. private Power power;
  6.  
  7. public Role getRole() {
  8. return role;
  9. }
  10.  
  11. public void setRole(Role role) {
  12. this.role = role;
  13. }
  14.  
  15. public Power getPower() {
  16. return power;
  17. }
  18.  
  19. public void setPower(Power power) {
  20. this.power = power;
  21. }
  22.  
  23. public RoleAndPower(Role role, Power power) {
  24. super();
  25. this.role = role;
  26. this.power = power;
  27. }
  28.  
  29. public RoleAndPower() {
  30. }
  31.  
  32. }

User.java

  1. package com.sysystem.model.entity;
  2.  
  3. import java.util.Set;
  4.  
  5. public class User {
  6. private Integer user_id;
  7. private String user_name;
  8. private String user_pass;
  9. private Set<UserAndRole> userRoles;
  10.  
  11. public User(Integer user_id, String user_name, String user_pass,
  12. Set<UserAndRole> userRoles) {
  13. super();
  14. this.user_id = user_id;
  15. this.user_name = user_name;
  16. this.user_pass = user_pass;
  17. this.userRoles = userRoles;
  18. }
  19.  
  20. public User() {
  21. super();
  22. // TODO Auto-generated constructor stub
  23. }
  24.  
  25. public User(String user_name, String user_pass) {
  26. super();
  27. this.user_name = user_name;
  28. this.user_pass = user_pass;
  29. }
  30.  
  31. public User(String user_name, String user_pass, Set<UserAndRole> userRoles) {
  32. super();
  33. this.user_name = user_name;
  34. this.user_pass = user_pass;
  35. this.userRoles = userRoles;
  36. }
  37.  
  38. public Set<UserAndRole> getUserRoles() {
  39. return userRoles;
  40. }
  41.  
  42. public void setUserRoles(Set<UserAndRole> userRoles) {
  43. this.userRoles = userRoles;
  44. }
  45.  
  46. public Integer getUser_id() {
  47. return user_id;
  48. }
  49.  
  50. public void setUser_id(Integer user_id) {
  51. this.user_id = user_id;
  52. }
  53.  
  54. public String getUser_name() {
  55. return user_name;
  56. }
  57.  
  58. public void setUser_name(String user_name) {
  59. this.user_name = user_name;
  60. }
  61.  
  62. public String getUser_pass() {
  63. return user_pass;
  64. }
  65.  
  66. public void setUser_pass(String user_pass) {
  67. this.user_pass = user_pass;
  68. }
  69.  
  70. public User(Integer user_id, String user_name, String user_pass) {
  71. super();
  72. this.user_id = user_id;
  73. this.user_name = user_name;
  74. this.user_pass = user_pass;
  75. }
  76.  
  77. }

UserAndRole.java

  1. package com.sysystem.model.entity;
  2.  
  3. public class UserAndRole {
  4. private User user;
  5. private Role role;
  6.  
  7. public User getUser() {
  8. return user;
  9. }
  10.  
  11. public void setUser(User user) {
  12. this.user = user;
  13. }
  14.  
  15. public Role getRole() {
  16. return role;
  17. }
  18.  
  19. public void setRole(Role role) {
  20. this.role = role;
  21. }
  22.  
  23. public UserAndRole(User user, Role role) {
  24. this.user = user;
  25. this.role = role;
  26. }
  27.  
  28. public UserAndRole() {
  29.  
  30. }
  31. }

dao层

IPowerDao.java

  1. package com.sysystem.model.dao;
  2.  
  3. import java.util.List;
  4. import java.util.Map;
  5.  
  6. import com.sysystem.model.entity.Power;
  7. import com.sysystem.model.entity.User;
  8.  
  9. public interface IPowerDao {
  10.  
  11. // 根据姓名查询用户
  12. List<User> getUserbyName(String name);
  13.  
  14. // 根据姓名获取该用户的所有一级标题
  15. List<Power> getfirstPow(String name);
  16.  
  17. // 根据一级标题获取子标题
  18. List<Power> getChildbyName(Map<String, Object> map);
  19.  
  20. // 根据姓名获得所有二级权限
  21. List<Power> getSecPow(String name);
  22.  
  23. }

IPowerDao.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5.  
  6. <mapper namespace="com.sysystem.model.dao.IPowerDao">
  7. <!-- 根据姓名获取用户 -->
  8. <select id="getUserbyName" parameterType="java.lang.String"
  9. resultType="User">
  10. select * from user where user_name = #{name}
  11. </select>
  12.  
  13. <!-- 根据姓名获取该用户的一级权限 -->
  14. <select id="getfirstPow" parameterType="java.lang.String"
  15. resultType="Power">
  16. SELECT
  17. p.power_id,
  18. p.power_name,
  19. p.pid
  20. FROM
  21. power p,
  22. role_power rp,
  23. USER u,
  24. role r,
  25. user_role ur
  26. WHERE
  27. p.power_id = rp.power_id
  28. AND r.role_id = rp.role_id
  29. AND u.user_id = ur.user_id
  30. AND r.role_id = ur.role_id
  31. AND u.user_name = #{name}
  32. AND p.pid IS NULL
  33. </select>
  34.  
  35. <!-- 根据姓名获取该用户的二级权限 -->
  36. <select id="getSecPow" parameterType="java.lang.String" resultType="Power">
  37. SELECT
  38. p.power_id,
  39. p.power_name,
  40. p.pid
  41. FROM
  42. power p,
  43. role_power rp,
  44. USER u,
  45. role r,
  46. user_role ur
  47. WHERE
  48. p.power_id = rp.power_id
  49. AND r.role_id = rp.role_id
  50. AND u.user_id = ur.user_id
  51. AND r.role_id = ur.role_id
  52. AND u.user_name = #{name}
  53. AND p.pid IS NOT NULL
  54. </select>
  55.  
  56. <!-- 获得指定具体人名的二级权限-->
  57. <select id="getChildbyName" parameterType="java.util.Map" resultType="Power">
  58. SELECT
  59. p.power_id,p.power_name
  60. FROM
  61. user u,
  62. role r,
  63. user_role ru,
  64. power p,
  65. role_power rp
  66. WHERE
  67. u.user_id = ru.user_id
  68. AND ru.role_id = r.role_id
  69. AND p.power_id = rp.power_id
  70. AND r.role_id = rp.role_id
  71. AND u.user_name = #{name}
  72. and p.pid = #{pid}
  73. </select>
  74.  
  75. </mapper>

service层

service层中的方法和dao层中的一样,调用了dao层中的方法

controller

PowerController.java

  1. package com.sysystem.controller;
  2.  
  3. import java.util.HashMap;
  4. import java.util.LinkedHashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import javax.annotation.Resource;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import javax.servlet.http.HttpSession;
  12.  
  13. import org.springframework.stereotype.Controller;
  14. import org.springframework.web.bind.annotation.RequestMapping;
  15.  
  16. import com.sysystem.model.entity.Power;
  17. import com.sysystem.model.entity.User;
  18. import com.sysystem.model.service.IPowerService;
  19.  
  20. @Controller
  21. @RequestMapping("/power")
  22. public class PowerController extends BaseController {
  23. @Resource
  24. private IPowerService powerService;
  25.  
  26. /**
  27. * 进行登录验证
  28. *
  29. */
  30. @RequestMapping("/login")
  31. public String login(HttpServletRequest request,
  32. HttpServletResponse response, User u) throws Exception {
  33. String error = "";
  34. // 根据姓名获得用户集合判断用户是否存在
  35. List<User> list = powerService.getUserbyName(u.getUser_name());
  36. if (list.size() == 0) {
  37. error = "用户不存在";
  38. request.setAttribute("error", error);
  39. return "login";
  40. // 根据账号密码判断是否输入正确
  41. } else if (!(u.getUser_name().equals(list.get(0).getUser_name()) && u
  42. .getUser_pass().equals(list.get(0).getUser_pass()))) {
  43. error = "密码错误";
  44. request.setAttribute("error", error);
  45. return "login";
  46. }
  47.  
  48. // 将用户名存放在session中
  49. HttpSession session = request.getSession();
  50. session.setAttribute("user", u);
  51. return "main";
  52. }
  53.  
  54. /**
  55. * 获得所有标题的json对象
  56. *
  57. */
  58. @RequestMapping("/findMenu")
  59. public void findMenu(HttpServletRequest request,
  60. HttpServletResponse response) throws Exception {
  61. User user = (User) request.getSession().getAttribute("user");
  62. String user_name = user.getUser_name();
  63.  
  64. // 获得指定用户的一级权限
  65. List<Power> firstpow = powerService.getfirstPow(user_name);
  66.  
  67. // 获得用户的二级权限
  68. List<Power> secPow = powerService.getSecPow(user_name);
  69.  
  70. // LinkedHashMap为有序的HashMap
  71. Map<String, Object> map = new LinkedHashMap<String, Object>();
  72.  
  73. // 遍历一级权限
  74. for (int i = 0; i < firstpow.size(); i++) {
  75. Map<String, Object> map2 = new HashMap<String, Object>();
  76. map2.put("name", user_name);
  77. map2.put("pid", secPow.get(i).getPid());
  78. // 获取一级权限下的子权限
  79. List<Power> getchild = powerService.getChildbyName(map2);
  80. // 将一级权限名和子权限放入map中
  81. map.put(firstpow.get(i).getPower_name(), getchild);
  82. }
  83. // 想响应的输出流中写json数据
  84. writeToRes(response, map);
  85.  
  86. }
  87.  
  88. }

jsp页面

login.jsp

  1. <body>
  2. ${error }
  3. <form action="<%=path %>/power/login.do" method="post">
  4. 用户名:<input type="text" name="user_name"/><br/>
  5. 密码:<input type="password" name="user_pass"/><br/>
  6. <input type="submit" value="登录"/>
  7. </form>
  8. </body>

main.jsp

  1. <script type="text/javascript" src="<%=path%>/js/jquery-1.11.1.js"></script>
  2. <script type="text/javascript">
  3. $(function(){
  4. window.location.href="<%=path%>/power/findMenu.do";
  5. });
  6. </script>
  7.  
  8. <body>
  9.  
  10. </body> 

项目部署运行之后,登入zhangsan的账户(老师)浏览器中输出

json在线解析后为

登入lisi账户(学生)

项目总结

项目的主要思路如下:

  首先通过用户名获取到一级权限和二级权限(注意,这里的一级和二级权限并没有关联起来,只是单纯的查询出来);

  然后创建一个LinkedHashMap<String,Object>,遍历一级权限,获得一级权限名当做Map的键,遍历二级权限,获得权限中的pid,即该权限的对应的上级权限的id,通过用户名和pid获得该一级权限下的二级权限,把二级权限当做Map的值;

  最后将map数据转为json数据输出。

实习小结(三)--- 权限管理(RBAC)的更多相关文章

  1. devops-jenkins基于角色的权限管理RBAC

    一. devops-jenkins基于角色的权限管理RBAC 1 安装角色的rbac角色管理  1.1) 点击系统管理 1.2) 选择插件管理 1.3) 选择可选插件,输入role搜索 1.4) 选择 ...

  2. 权限管理RBAC模型概述

    一.什么是RBAC模型 RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是比较早期提出的权限实现模型,在多用户计算机时期该思想即被提出,其中以美国George ...

  3. struts2学习之旅三 权限管理和导航设计

    1,权限管理的db设计和dao实现,尽量简单快速有效: db的设计如下:权限按照角色来赋给用户: 权限对应每一个具体的功能,有菜单级别的,有导航级别的,还有页面级别的功能: 涉及到权限的敏感操作一般都 ...

  4. php人员权限管理(RBAC)

    在说权限管理前,应该先知道权限管理要有哪些功能: (1).用户只能访问,指定的控制器,指定的方法 (2).用户可以存在于多个用户组里 (3).用户组可以选择,指定的控制器,指定的方法  (4).可以添 ...

  5. 详解权限管理(RBAC)的实现方法

    在说权限管理前,应该先知道权限管理要有哪些功能: ().用户只能访问,指定的控制器,指定的方法 ().用户可以存在于多个用户组里 ().用户组可以选择,指定的控制器,指定的方法 ().可以添加控制器和 ...

  6. 权限管理-RBAC

    (一)RBAC 通过用户与角色关联,角色与操作的关联实现用户与操作的关联 (二)权限细分 (三)数据库设计 (四)程序设计 (五)权限与应用程序 (1)应用URL实现程序权限控制 (2)应用code实 ...

  7. thinkphp权限管理Rbac实例

    首先,先建立Rbac那五张表(用户表,角色表,节点表,权限表,角色-用户表),后面四张可以在thinkphp中Rbac类里直接复制. 第二步,根据需求往那五张表里插入数据,注意:节点表里的节点名称一定 ...

  8. php 人员权限管理(RBAC)

    一.想好这个权限是什么? 就做一个就像是vip的功能,普通用户和vip用户的功能是不一样的,先来考虑一下数据库怎么设计 肯定要有用户表.还有用户所用的角色.然后就是权限功能表:可是在这里面有关联也就 ...

  9. Django_用户权限管理rbac

    组成部分 1.初始化权限:login视图initial_permission,把权限信息放入session.initial_permission函数生成权限列表.菜单列表 2.中间件验证权限:在第一次 ...

  10. Yii的权限管理rbac

    1.首先我们要在配置文件的组件(component)里面配置一下 Rbac 在对应项目下的config/main.php或者config/main-local.php下添加 'authManager' ...

随机推荐

  1. eclipse如何汉化,把eclipse改成中文版

    eclipse默认是英文版的,对于中国人来说使用英文语言的软件是件痛苦的事情.下面我来详细说一下如何把eclipse改成中文版的. 工具/原料   eclipse英文版 eclipse中文插件 方法/ ...

  2. [ActionScript3.0] AS3利用ExternalInterface与js通信

    AS3代码,可做文档类; package { import flash.display.Sprite; import flash.events.*; import flash.external.Ext ...

  3. 架构师养成记--25.linux用户管理

    用户管理配置文件用户信息文件:/etc/passwd密码文件:/etc/shadow用户配置文件:/etc/login.defs /etc/default/useradd新用户信息文件:/etc/sk ...

  4. Django分页的实现

    Django分页的实现 Django ORM  分页介绍 分页是网页浏览中常见到的一种形式,在数据量较大时,一个页面显示不全,采取分割数据由用户选择进行显示的方式. 基本实现 技术点 通过切片得到数据 ...

  5. LCS and LIS

    LCS #include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; char s[1005],t ...

  6. centos 6.6 设备 xxx 似乎不存在, 初始化操作将被延迟

    2019-04-02 问题描述: centos 6.6开启虚拟机之后,网卡服务不能正常启动,报错信息为:设备 xxx(网卡名称)似乎不存在, 初始化操作将被延迟 解决办法: 清空70-persiste ...

  7. PHPStorm操作小技巧

    1.围绕选中字符输入引号或者括号 2.设置服务器部署 3.隐藏Project快捷键 Shift + Esc 4.IDE内窗口切换 Ctrl + TAB 5.关闭当前项目 File -> Clos ...

  8. VS2015 MSVCRTD.lib(_chandler4gs_.obj) : error LNK2019: unresolved external symbol __except_handler4_common referenced in function __except_handler4

    今天在VS2015中用编译好的QT5静态库打包软件,配置好QT的静态环境后, 发现报MSVCRTD.lib(_chandler4gs_.obj) : error LNK2019: unresolved ...

  9. 【文档】六、Mysql Binlog版本

    binlog文件格式有以下几种: v1:用于3.23版本 v3:用于4.0.2到4.1版本 v4:用于5.0及以上版本 v2版本只在4.0.x版本中使用,目前已经不再支持了. 处理binlog的程序必 ...

  10. 第3章—高级装配—bean的作用域

    bean的作用域 bean的默认作用域 Spring定义了多种作用域,可以基于这些作用域创建bean,包括: 单例(Singleton):在整个应用中,只创建bean的一个实例. 原型(Prototy ...