springBoot+mysql实现用户权限控制--系统框架搭建(四)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: springBoot+mysql实现用户权限控制--系统框架搭建(四)

上篇文章说了AOP实现上下文的存储,有需要的可以看看,

AOP实现上下文存储 --- 系统框架搭建(三)

环境需求:springboot + mysql 5.7.16 + Lombok 1.18.12


1、需求背景


为了实现不同的客户群体,看到的管理系统菜单目录不同,所以要给他们分配不同的权限,比如校长可以给老师分配不同的课程,学生只可以访问课程不可以修改课程,老师不光可以访问课程,还可以修改和新增课程。

上面只是举个例子,总之核心就是为了实现,不同的角色只能使用相对应的功能,各自分工不同。


2、功能实现


表单设计:角色表,用户表,权限表。

用户表user_auth:id,delete_id ,name,工号,role_id

角色表role_auth:id,delete_id,角色name,权限等级(lv0,lv1,lv2,common)。

路径表auth_source:id,delete_id, front_source,source_name,url(后端url用,隔开,可以匹配*号),parent_id,source_level,external_id(用于扩展的外部资源)

mysql> create table user_auth(
    ->   id int AUTO_INCREMENT,
    ->   delete_id int comment '默认0,删除改为当前id',
    ->   user_id varchar(32) comment '工号',
    ->   user_name varchar(32) comment '姓名',
    ->   role_id int comment '角色id',
    ->   primary key(id)
    -> )engine=InnoDB charset=utf8 row_format=dynamic;
Query OK, 0 rows affected (0.05 sec)
mysql> create table role_auth(
    -> id int auto_increment,
    -> delete_id int comment '默认0,删除改为当前id',
    -> role_name varchar(32) comment '角色名称',
    -> level varchar(32) comment '权限等级:lv0最高,lv1次之,common通用',
    -> primary key(id)
    -> )engine=InnoDB charset=utf8 row_format=dynamic;
Query OK, 0 rows affected (0.04 sec)
mysql> create table auth_source(
    -> id int auto_increment,
    -> delete_id int comment '默认0,删除改为当前id',
    -> front_source varchar(64) comment '前端路径',
    -> source_name varchar(64) comment '前端名称',
    -> url varchar(512) comment '后端url用,隔开,可以匹配*',
    -> parent_id int comment '上一级id',
    -> source_level varchar(32) comment '权限等级',
    -> external_id int comment '扩展外部id',
    -> primary key(id)
    -> )engine=InnoDB charset=utf8 row_format=dynamic;
Query OK, 0 rows affected (0.03 sec)
//给他们加入数据
insert into role_auth(delete_id,role_name,level) values (0,'班主任','lv0');
insert into role_auth(delete_id,role_name,level) values (0,'学生','lv1');
insert into role_auth(delete_id,role_name,level) values (0,'通用','common');
insert into user_auth (delete_id,user_id,user_name,role_id) values (0,'teacher01','王育人',1);
insert into user_auth (delete_id,user_id,user_name,role_id) values (0,'student01','根正苗红好青年',2);
insert into auth_source (delete_id,front_source,source_name,url,parent_id,source_level) values (0,'course_delete','课程删除','/api/course/*','0','lv0');
insert into auth_source (delete_id,front_source,source_name,url,parent_id,source_level) values (0,'course_query','课程新增','/api/course/add','0','lv1');

创建表的时候注意事项:看表单设计需要注意的是,auth_source通过level等级权限关联的,并不是通过role_id权限关联的,如果是通过角色id关联,那业务效果会不太一样,比如现在是通过lv关联,如果校长和老师权限都是lv1,那么校长和老师都会开通一起开通这个权限。

添加数据时候注意事项:

看我添加数据的顺序,我是先给role_auth添加数据的,因为role_id在给用户表添加的时候需要用到,当然不按这个顺序也是可以的,先给用户表添加数据,之后再把角色的role_id修改进去。


3、代码详解


/**
 * 权限
 *
 * @author keying
 * @date 2021/9/29
 */
@Configuration
public class AuthConfiguration implements WebMvcConfigurer {
    @Resource
    private AuthSourceMapper authSourceMapper;
    @Resource
    private UserAuthMapper userAuthMapper;
    @Resource
    private RoleAuthMapper roleAuthMapper;
    @Resource
    private AuthService authService;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
                String requestUrl =  request.getRequestURI();
                Boolean flag = authService.getAllUrl(requestUrl);
                if(flag){
                    return true;
                }
                return false;
            }
        });
        interceptorRegistration.addPathPatterns("/**");
    }
}
package com.alibaba.first.service.lmpl;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import com.alibaba.first.mapper.AuthSourceMapper;
import com.alibaba.first.mapper.RoleAuthMapper;
import com.alibaba.first.mapper.UserAuthMapper;
import com.alibaba.first.model.AuthSource;
import com.alibaba.first.service.AuthService;
import org.springframework.stereotype.Service;
/**
 * 权限
 *
 * @author keying
 * @date 2021/9/29
 */
@Service
public class AuthServiceImpl implements AuthService {
    @Resource
    private AuthSourceMapper authSourceMapper;
    @Resource
    private UserAuthMapper userAuthMapper;
    @Resource
    private RoleAuthMapper roleAuthMapper;
    @Override
    public boolean getAllUrl(String requestUrl) {
        List<AuthSource> authSourceList = authSourceMapper.getAllUrl();
        List<String> urlStringList = authSourceList.stream().map(AuthSource::getUrl).collect(Collectors.toList());
        StringBuffer stringBuffer = new StringBuffer();
        for (String string : urlStringList) {
            stringBuffer.append(string);
        }
        String urlString = stringBuffer.toString();
        //是否包含
        if (requestUrl.contains("?")) {
            //包含问号
            requestUrl = requestUrl.substring(0, requestUrl.lastIndexOf("?"));
        } else {
            //不包含问号
            requestUrl = requestUrl.substring(0, requestUrl.lastIndexOf("/") + 1);
        }
        if (urlString.contains(requestUrl)) {
            //包含,有权限
            return true;
        } else {
            //不包含
            int a = requestUrl.indexOf("/");
            int b = requestUrl.indexOf("/", a + 1);
            int c = requestUrl.indexOf("/", b + 1);
            requestUrl = requestUrl.substring(0, c);
            requestUrl = requestUrl + "/*";
            if (urlString.contains(requestUrl)) {
                return true;
            }
            return false;
        }
    }
    public static void main(String[] args) {
        String url1 = "api/course/1";
        String url2 = "api/course?pagesize=1&counrentPage=100";
        String url3 = "api/course/getById/getByid";
        int a = url3.indexOf("/");
        int b = url3.indexOf("/", a + 1);
        String z = url3.substring(0, b);
        System.out.println(z);
    }
}
/**
 * 权限管理
 *
 * @author keying
 * @date 2021/9/29
 */
@Controller
@RequestMapping("/api/course")
public class AuthController {
    /*@DeleteMapping("/id")
    public void delete(@PathVariable Integer id) {
        System.out.println("删除" + id);
    }
    @PostMapping("/id")
    public void add(@PathVariable Integer id) {
        System.out.println("新增" + id);
    }*/
    @RequestMapping("/query")
    public void query() {
        System.out.println("查询");
    }
}
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
19天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
38 5
|
1月前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
54 8
|
1月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
60 9
|
1月前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
186 1
|
1月前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
110 3
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
1月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
45 0
|
1月前
|
关系型数据库 MySQL Java
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
34 0
|
Java Spring
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
132 0
下一篇
DataWorks