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

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

表结构图

表之前的关联如上图:

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

用户表 user

角色表 role

用户角色关系表 user_role

权限表 power

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

角色权限关系表 role_power

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

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

展示效果

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

学生登录显示得内容为

项目代码

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

项目的目录结构如下

实体类

Power.java

package com.sysystem.model.entity;

public class Power {

    private Integer power_id;
private String power_name;
private Integer pid;
private Power prwer; public Power getPrwer() {
return prwer;
} public void setPrwer(Power prwer) {
this.prwer = prwer;
} public Integer getPid() {
return pid;
} public void setPid(Integer pid) {
this.pid = pid;
} public Integer getPower_id() {
return power_id;
} public void setPower_id(Integer power_id) {
this.power_id = power_id;
} public String getPower_name() {
return power_name;
} public void setPower_name(String power_name) {
this.power_name = power_name;
} public Power(Integer power_id, String power_name) {
super();
this.power_id = power_id;
this.power_name = power_name;
} public Power() { } public Power(Integer power_id, String power_name, Integer pid, Power prwer) {
super();
this.power_id = power_id;
this.power_name = power_name;
this.pid = pid;
this.prwer = prwer;
} }

Role.java

package com.sysystem.model.entity;

public class Role {
private Integer role_id;
private String role_name;
private String remark; public Integer getRole_id() {
return role_id;
} public void setRole_id(Integer role_id) {
this.role_id = role_id;
} public String getRole_name() {
return role_name;
} public void setRole_name(String role_name) {
this.role_name = role_name;
} public String getRemark() {
return remark;
} public void setRemark(String remark) {
this.remark = remark;
} public Role(Integer role_id, String role_name, String remark) {
super();
this.role_id = role_id;
this.role_name = role_name;
this.remark = remark;
} public Role(String role_name, String remark) {
super();
this.role_name = role_name;
this.remark = remark;
} }

RoleAndPower.java

package com.sysystem.model.entity;

public class RoleAndPower {
private Role role;
private Power power; public Role getRole() {
return role;
} public void setRole(Role role) {
this.role = role;
} public Power getPower() {
return power;
} public void setPower(Power power) {
this.power = power;
} public RoleAndPower(Role role, Power power) {
super();
this.role = role;
this.power = power;
} public RoleAndPower() {
} }

User.java

package com.sysystem.model.entity;

import java.util.Set;

public class User {
private Integer user_id;
private String user_name;
private String user_pass;
private Set<UserAndRole> userRoles; public User(Integer user_id, String user_name, String user_pass,
Set<UserAndRole> userRoles) {
super();
this.user_id = user_id;
this.user_name = user_name;
this.user_pass = user_pass;
this.userRoles = userRoles;
} public User() {
super();
// TODO Auto-generated constructor stub
} public User(String user_name, String user_pass) {
super();
this.user_name = user_name;
this.user_pass = user_pass;
} public User(String user_name, String user_pass, Set<UserAndRole> userRoles) {
super();
this.user_name = user_name;
this.user_pass = user_pass;
this.userRoles = userRoles;
} public Set<UserAndRole> getUserRoles() {
return userRoles;
} public void setUserRoles(Set<UserAndRole> userRoles) {
this.userRoles = userRoles;
} public Integer getUser_id() {
return user_id;
} public void setUser_id(Integer user_id) {
this.user_id = user_id;
} public String getUser_name() {
return user_name;
} public void setUser_name(String user_name) {
this.user_name = user_name;
} public String getUser_pass() {
return user_pass;
} public void setUser_pass(String user_pass) {
this.user_pass = user_pass;
} public User(Integer user_id, String user_name, String user_pass) {
super();
this.user_id = user_id;
this.user_name = user_name;
this.user_pass = user_pass;
} }

UserAndRole.java

package com.sysystem.model.entity;

public class UserAndRole {
private User user;
private Role role; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public Role getRole() {
return role;
} public void setRole(Role role) {
this.role = role;
} public UserAndRole(User user, Role role) {
this.user = user;
this.role = role;
} public UserAndRole() { }
}

dao层

IPowerDao.java

package com.sysystem.model.dao;

import java.util.List;
import java.util.Map; import com.sysystem.model.entity.Power;
import com.sysystem.model.entity.User; public interface IPowerDao { // 根据姓名查询用户
List<User> getUserbyName(String name); // 根据姓名获取该用户的所有一级标题
List<Power> getfirstPow(String name); // 根据一级标题获取子标题
List<Power> getChildbyName(Map<String, Object> map); // 根据姓名获得所有二级权限
List<Power> getSecPow(String name); }

IPowerDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.sysystem.model.dao.IPowerDao">
<!-- 根据姓名获取用户 -->
<select id="getUserbyName" parameterType="java.lang.String"
resultType="User">
select * from user where user_name = #{name}
</select> <!-- 根据姓名获取该用户的一级权限 -->
<select id="getfirstPow" parameterType="java.lang.String"
resultType="Power">
SELECT
p.power_id,
p.power_name,
p.pid
FROM
power p,
role_power rp,
USER u,
role r,
user_role ur
WHERE
p.power_id = rp.power_id
AND r.role_id = rp.role_id
AND u.user_id = ur.user_id
AND r.role_id = ur.role_id
AND u.user_name = #{name}
AND p.pid IS NULL
</select> <!-- 根据姓名获取该用户的二级权限 -->
<select id="getSecPow" parameterType="java.lang.String" resultType="Power">
SELECT
p.power_id,
p.power_name,
p.pid
FROM
power p,
role_power rp,
USER u,
role r,
user_role ur
WHERE
p.power_id = rp.power_id
AND r.role_id = rp.role_id
AND u.user_id = ur.user_id
AND r.role_id = ur.role_id
AND u.user_name = #{name}
AND p.pid IS NOT NULL
</select> <!-- 获得指定具体人名的二级权限-->
<select id="getChildbyName" parameterType="java.util.Map" resultType="Power">
SELECT
p.power_id,p.power_name
FROM
user u,
role r,
user_role ru,
power p,
role_power rp
WHERE
u.user_id = ru.user_id
AND ru.role_id = r.role_id
AND p.power_id = rp.power_id
AND r.role_id = rp.role_id
AND u.user_name = #{name}
and p.pid = #{pid}
</select> </mapper>

service层

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

controller

PowerController.java

package com.sysystem.controller;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import com.sysystem.model.entity.Power;
import com.sysystem.model.entity.User;
import com.sysystem.model.service.IPowerService; @Controller
@RequestMapping("/power")
public class PowerController extends BaseController {
@Resource
private IPowerService powerService; /**
* 进行登录验证
*
*/
@RequestMapping("/login")
public String login(HttpServletRequest request,
HttpServletResponse response, User u) throws Exception {
String error = "";
// 根据姓名获得用户集合判断用户是否存在
List<User> list = powerService.getUserbyName(u.getUser_name());
if (list.size() == 0) {
error = "用户不存在";
request.setAttribute("error", error);
return "login";
// 根据账号密码判断是否输入正确
} else if (!(u.getUser_name().equals(list.get(0).getUser_name()) && u
.getUser_pass().equals(list.get(0).getUser_pass()))) {
error = "密码错误";
request.setAttribute("error", error);
return "login";
} // 将用户名存放在session中
HttpSession session = request.getSession();
session.setAttribute("user", u);
return "main";
} /**
* 获得所有标题的json对象
*
*/
@RequestMapping("/findMenu")
public void findMenu(HttpServletRequest request,
HttpServletResponse response) throws Exception {
User user = (User) request.getSession().getAttribute("user");
String user_name = user.getUser_name(); // 获得指定用户的一级权限
List<Power> firstpow = powerService.getfirstPow(user_name); // 获得用户的二级权限
List<Power> secPow = powerService.getSecPow(user_name); // LinkedHashMap为有序的HashMap
Map<String, Object> map = new LinkedHashMap<String, Object>(); // 遍历一级权限
for (int i = 0; i < firstpow.size(); i++) {
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("name", user_name);
map2.put("pid", secPow.get(i).getPid());
// 获取一级权限下的子权限
List<Power> getchild = powerService.getChildbyName(map2);
// 将一级权限名和子权限放入map中
map.put(firstpow.get(i).getPower_name(), getchild);
}
// 想响应的输出流中写json数据
writeToRes(response, map); } }

jsp页面

login.jsp

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

main.jsp

<script type="text/javascript" src="<%=path%>/js/jquery-1.11.1.js"></script>
<script type="text/javascript">
$(function(){
window.location.href="<%=path%>/power/findMenu.do";
});
</script> <body> </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. npm start时报错 npm ERR!Windows_NT 6.1.7601

    练习webpack 时 输入 npm start就报这样的错.百度了一圈,都没有找到答案.于是,我开始看错误信息......................................../手动黑 ...

  2. Getting Started with Elastic Search in .NET

    I have been working on many application during my career.  Many if not all had some searching capabi ...

  3. 【Qt】VS2010编译Qt5.3.2 64bit

    1. 为什么要这么做 在Windows下,Qt官网默认提供的二进制版本大多是32位,目前(2015.01.24)只对VS2013提供了64位版本,如下图所示: 为了适应我目前安装的VS2010 IDE ...

  4. vue二级路由跳转后外部引入js失效问题解决方案

    vue路由可以通过children嵌套,于是可以形成二级路由等等... 案例如下: routes: [ { path: '/', name: 'dy', component: dy, children ...

  5. vue+ivew-admin开发项目,内存占用过大解决办法

    项目用的ivew+admin ivewUI,直接从github上拉下来用的,配置也没改,我们页面比较多,大该30个页面的样子,一启用,我们的电脑就卡了,然后,看一下,内存占用 1.5G+了,我们电脑4 ...

  6. javascriptdocument load 和document ready的区别

    页面加载完成有两种事件,一是ready , 表示文档结构已经加载完成(貋图片等非文字媒体文件),二是onload 指示页面包含图片等文件在内的所有元素都加载完成.   1.执行时间不同: 从字面的意思 ...

  7. 架构师养成记--20.netty的tcp拆包粘包问题

    问题描述 比如要发ABC DEFG HIJK 这一串数据,其中ABC是一个包,DEFG是一个包,HIJK是一个包.由于TCP是基于流发送的,所以有可能出现ABCD EFGH 这种情况,那么ABC和D就 ...

  8. mysql工具——mysqlcheck(MYISAM)

    基本介绍 演示: 使用optimize的时候,可能会出现 Table does not support optimize, doing recreate + analyze instead 这时候参考 ...

  9. Q239 滑动窗口最大值

    给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值. 示例: 输入: nums ...

  10. c# 抽象类 抽象方法

    抽象类与非抽象类的主要区别: ·抽象类不能直接被实例化 ·抽象类中可以包含抽象成员,但非抽象类中不可以 ·抽象类不能被密封 声明抽象方法时需注意:·抽象方法必须声明在抽象类中 ·声明抽象方法时,不能使 ...