06_04_SSM拉勾教育后台管理系统(权限模块\登录及动态菜单)

拉勾教育后台管理系统(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的嵌套查询来完成

  1. 先进行查询顶级(父级)菜单(所有顶级菜单,他们的parent_id的值为-1)

select * from menu where parent_id = -1

  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" >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值