拉勾教育后台管理系统(SSM)权限模块
权限概念介绍
- 权限:权利(能做的)和限制(不能做的),在权限范围内做好自己的事情,不该看的不看,不该做的不做
- 认证: 验证用户名密码是否正确的过程
- 授权: 对用户所能访问的资源进行控制(动态显示菜单、url级别的权限控制)
为什么要实现权限系统
- 首先系统需要进行登陆才能访问
- 其次不同登陆用户要有不同的权利,而且要有不同的菜单(例如财务经理针对系统中财务相关模块进行 操作,人事经理针对系统中人事模块进行操作)
权限控制基本原理
1.ACL(Access Control Lists,缩写ACL)
ACL是最早也是最基本的一种访问控制机制,
它的原理非常简单:每一项资源,都配有一个列表,这个列表记录的就是哪些用户可以对这项资源执行CRUD中的那些操作。
当系统试图访问这项资源时,会首先检查这个列表中是否有关于当前用户的访问权限,从而确定当前用户可否执行相应的操作。
总得来 说,ACL是一种面向资源的访问控制模型,它的机制是围绕“资源”展开的。
2.基于角色的访问控制RBAC(Role-Based Access Control)
RBAC是把用户按角色进行归类,
通过用户的角色来确定用户能否针对某项资源进行某项操作。
RBAC相对于ACL最大的优势就是它简化了用户与权限的管理,通过对用户进行分类,使得角色与权限关联起来,而用户与权限变成了间接关联。
RBAC模型使得访问控制,特别是对用户的授权管理变得非常 简单和易于维护,因此有广泛的应用

规则一:每个登陆的用户,可以有多个角色;
规则二:每个角色又可以拥有多个权限(包含菜单和资源);
权限模块功能分析
权限模块主要细分为角色模块、菜单模块、资源模块,
将针对细分的三个模块进行具体功能实现,同时实现以下功能:
- 角色列表&条件查询(角色模块)
- 分配菜单(角色模块)
- 删除角色(角色模块)
- 菜单列表查询(菜单模块)
- 查询菜单信息回显(菜单模块)
- 资源分页&多条件查询(资源模块)
- 用户登陆(用户模块)
- 动态菜单展示(权限模块)
- 用户关联角色(用户模块)




权限管理模块表设计
表关系介绍
1.ER图


2.数据实体描述
2.1 菜单表(menu)
| 字段类型 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | int(11) | PK | 自增主键 |
| parent_id | int(11) | 父菜单id,顶级菜父菜单id为-1 | |
| href | varchar(200) | 菜单路径 | |
| icon | varchar(200) | 菜单图标 | |
| name | varchar(200) | 菜单名称 | |
| description | varchar(500) | 描述 | |
| order_num | int(11) | 排序号 | |
| shown | tinyint(2) | 是否显示 | |
| level | int(11) | 菜单层级,从0开始,越大层级越低 | |
| created_time | datetime | 创建时间 | |
| updated_time | datetime | 更新时间 | |
| created_by | varchar(100) | 创建人 | |
| updated_by | varchar(100) | 更新人 |
2.2 资源分类表(resource_category)
| 字段类型 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | int(11) | PK | 自增主键 |
| name | varchar(200) | 资源分类名称 | |
| sort | int(11) | 排序,从小到大顺序排 | |
| created_time | datetime | 创建时间 | |
| updated_time | datetime | 更新时间 | |
| created_by | varchar(100) | 创建人 | |
| updated_by | varchar(100) | 更新人 |
2.3 资源表(resource)
| 字段类型 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | int(11) | PK | 自增主键 |
| name | varchar(200) | 资源名称 | |
| url | varchar(200) | 资源url | |
| category_id | int(11) | 资源分类ID | |
| description | varchar(500) | 描述 | |
| created_time | datetime | 创建时间 | |
| updated_time | datetime | 更新时间 | |
| created_by | varchar(100) | 创建人 | |
| updated_by | varchar(100) | 更新人 |
2.4 角色表(roles)
| 字段类型 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | int(11) | PK | 自增主键 |
| code | varchar(100) | 角色code | |
| name | varchar(200) | 角色名称 | |
| description | varchar(500) | 描述 | |
| created_time | datetime | 创建时间 | |
| updated_time | datetime | 更新时间 | |
| created_by | varchar(100) | 创建人 | |
| updated_by | varchar(100) | 更新人 |
2.5 用户-角色关系表(user_role_relation)
| 字段类型 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | int(11) | PK | 自增主键 |
| user_id | int(11) | 用户ID | |
| role_id | int(11) | 角色ID | |
| created_time | datetime | 创建时间 | |
| updated_time | datetime | 更新时间 | |
| created_by | varchar(100) | 创建人 | |
| updated_by | varchar(100) | 更新人 |
2.6 角色-菜单关系表(role_menu_relation)
| 字段类型 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | int(11) | PK | 自增主键 |
| menu_id | int(11) | 菜单ID | |
| role_id | int(11) | 角色ID | |
| created_time | datetime | 创建时间 | |
| updated_time | datetime | 更新时间 | |
| created_by | varchar(100) | 创建人 | |
| updated_by | varchar(100) | 更新人 |
2.7 角色-资源关系表(role_resource_relation)
| 字段类型 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | int(11) | PK | 自增主键 |
| resource_id | int(11) | 资源ID | |
| role_id | int(11) | 角色ID | |
| created_time | datetime | 创建时间 | |
| updated_time | datetime | 更新时间 | |
| created_by | varchar(100) | 创建人 | |
| updated_by | varchar(100) | 更新人 |
权限管理(角色模块)接口实现
角色列表查询&条件查询
需求:点击角色列表按钮进行角色列表展示

查看接口文档,进行编码
实体类:Role
/*角色表*/
public class Role {
private Integer id;
private String code;
private String name;
private String description;
private Date createdTime;
private Date updatedTime;
private String createdBy;
private String updatedBy;
//getter/setter...
}
Dao层:RoleMapper
public interface RoleMapper {
/*
查询角色列表(条件)
*/
public List<Role> findAllRole(Role role);
}
<?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.lagou.dao.RoleMapper">
<!--查询所有角色(条件)-->
<select id="findAllRole" resultType="com.lagou.domain.Role">
SELECT
id,
CODE,
NAME,
description,
created_time,
updated_time,
created_by,
updated_by
FROM roles
<where>
<if test="name != null and name != ''">
and name = #{name}
</if>
</where>
</select>
Service层:RoleService
public interface RoleService {
public List<Role> findAllRole(Role role);
}
@Service
public class RoleServiceImpl implements RoleService {
@Autowired
private RoleMapper roleMapper;
@Override
public List<Role> findAllRole(Role role) {
List<Role> allRole = roleMapper.findAllRole(role);
return allRole;
}
}
Web层:RoleController
@RestController
@RequestMapping("/role")
public class RoleController {
@Autowired
private RoleService roleService;
@RequestMapping("/findAllRole")
public ResponseResult findAllUserByPage(@RequestBody Role role){
List<Role> allRole = roleService.findAllRole(role);
ResponseResult responseResult = new ResponseResult(true,200,"响应成功",allRole);
return responseResult;
}
}
Postman测试接口
分配菜单
需求:点击分配菜单,回显可选择菜单信息,并回显选中状态


要进行两个接口的查询,一个是查询所有的菜单阶段的信息getMenuNodeList,一个是查询对应的现有的权限信息。
接口1 查询所有菜单列表
菜单查询通过关联查询:自连接查询(将一张表拆分成两张表来看)
步骤:
基于mybatis的嵌套查询来完成
- 先进行查询顶级(父级)菜单(所有顶级菜单,他们的parent_id的值为-1)
select * from menu where parent_id = -1
- 其次要查询顶级菜单所关联的子级菜单信息(子级菜单中parent_id就等于父级菜单中的id)
select * from menu where parent_id = 父级.id
Dao层:MenuMapper
public interface MenuMapper {
/**
* 查询全部的父子菜单信息
* */
public List<Menu> findSubMenuListByPid(int pid);
}
<!-- 一对多: 查找子孙菜单
-->
<select id="findSubMenuListByPid" resultMap="MenuResult">
select * from menu where parent_id = #{pid}
</select>
<!-- 根据pid 查询所有子分类集合 -->
<resultMap id="MenuResult" type="com.lagou.domain.Menu">
<id column="id" property="id"></id>
<result column="href" property="href"></result>
<result column="icon" property="icon"></result>
<result column="name" property="name"></result>
<result column="parent_id" property="parentId"></result>
<result column="description" property="description"></result>
<result column="order_num" property="orderNum"></result>
<result column="shown" property="shown"></result>
<result column="created_time" property="createdTime"></result>
<result column="updated_time" property="updatedTime"></result>
<result column="created_by" property="createdBy"></result>
<result column="updated_by" property="updatedBy"></result>
<collection property="subMenuList" ofType="com.lagou.domain.Menu"
select="findSubMenuListByPid" column="id" >

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



