首页 > 数据库 >RBAC权限模型、建表及SQL语句编写

RBAC权限模型、建表及SQL语句编写

时间:2023-04-23 11:57:17浏览次数:32  
标签:COMMENT sys NULL DEFAULT RBAC role SQL 建表及 id

RBAC权限模型

RBAC权限模型(Role-Based Access Control)即:基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。

建表及SQL语句编写

准备工作

创建数据库SQL表

CREATE DATABASE /*!32312 IF NOT EXISTS*/`sg_security` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
 
USE `sg_security`;
 
/*Table structure for table `sys_menu` */
 
DROP TABLE IF EXISTS `sys_menu`;
 
CREATE TABLE `sys_menu` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `menu_name` varchar(64) NOT NULL DEFAULT 'NULL' COMMENT '菜单名',
  `path` varchar(200) DEFAULT NULL COMMENT '路由地址',
  `component` varchar(255) DEFAULT NULL COMMENT '组件路径',
  `visible` char(1) DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)',
  `status` char(1) DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',
  `perms` varchar(100) DEFAULT NULL COMMENT '权限标识',
  `icon` varchar(100) DEFAULT '#' COMMENT '菜单图标',
  `create_by` bigint(20) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_by` bigint(20) DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  `del_flag` int(11) DEFAULT '0' COMMENT '是否删除(0未删除 1已删除)',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';
 
/*Table structure for table `sys_role` */
 
DROP TABLE IF EXISTS `sys_role`;
 
CREATE TABLE `sys_role` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) DEFAULT NULL,
  `role_key` varchar(100) DEFAULT NULL COMMENT '角色权限字符串',
  `status` char(1) DEFAULT '0' COMMENT '角色状态(0正常 1停用)',
  `del_flag` int(1) DEFAULT '0' COMMENT 'del_flag',
  `create_by` bigint(200) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_by` bigint(200) DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
 
/*Table structure for table `sys_role_menu` */
 
DROP TABLE IF EXISTS `sys_role_menu`;
 
CREATE TABLE `sys_role_menu` (
  `role_id` bigint(200) NOT NULL AUTO_INCREMENT COMMENT '角色ID',
  `menu_id` bigint(200) NOT NULL DEFAULT '0' COMMENT '菜单id',
  PRIMARY KEY (`role_id`,`menu_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
 
/*Table structure for table `sys_user` */
 
DROP TABLE IF EXISTS `sys_user`;
 
CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_name` varchar(64) NOT NULL DEFAULT 'NULL' COMMENT '用户名',
  `nick_name` varchar(64) NOT NULL DEFAULT 'NULL' COMMENT '昵称',
  `password` varchar(64) NOT NULL DEFAULT 'NULL' COMMENT '密码',
  `status` char(1) DEFAULT '0' COMMENT '账号状态(0正常 1停用)',
  `email` varchar(64) DEFAULT NULL COMMENT '邮箱',
  `phonenumber` varchar(32) DEFAULT NULL COMMENT '手机号',
  `sex` char(1) DEFAULT NULL COMMENT '用户性别(0男,1女,2未知)',
  `avatar` varchar(128) DEFAULT NULL COMMENT '头像',
  `user_type` char(1) NOT NULL DEFAULT '1' COMMENT '用户类型(0管理员,1普通用户)',
  `create_by` bigint(20) DEFAULT NULL COMMENT '创建人的用户id',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` bigint(20) DEFAULT NULL COMMENT '更新人',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `del_flag` int(11) DEFAULT '0' COMMENT '删除标志(0代表未删除,1代表已删除)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
 
/*Table structure for table `sys_user_role` */
 
DROP TABLE IF EXISTS `sys_user_role`;
 
CREATE TABLE `sys_user_role` (
  `user_id` bigint(200) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `role_id` bigint(200) NOT NULL DEFAULT '0' COMMENT '角色id',
  PRIMARY KEY (`user_id`,`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

根据userid查询 perms 对应的role和menu都必须是正常状态的

SELECT 
    DISTINCT m.`perms`
FROM
    sys_user_role ur
    LEFT JOIN `sys_role` r ON ur.`role_id` = r.`id`
    LEFT JOIN `sys_role_menu` rm ON ur.`role_id` = rm.`role_id`
    LEFT JOIN `sys_menu` m ON m.`id` = rm.`menu_id`
WHERE
    user_id = 2
    AND r.`status` = 0
    AND m.`status` = 0

菜单表(Menu)实体类

package com.sangeng.domain;
 
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 
import java.io.Serializable;
import java.util.Date;
 
/**
 * 菜单表(Menu)实体类
 *
 * @author makejava
 * @since 2021-11-24 15:30:08
 */
@TableName(value="sys_menu")
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Menu implements Serializable {
    private static final long serialVersionUID = -54979041104113736L;
    
        @TableId
    private Long id;
    /**
    * 菜单名
    */
    private String menuName;
    /**
    * 路由地址
    */
    private String path;
    /**
    * 组件路径
    */
    private String component;
    /**
    * 菜单状态(0显示 1隐藏)
    */
    private String visible;
    /**
    * 菜单状态(0正常 1停用)
    */
    private String status;
    /**
    * 权限标识
    */
    private String perms;
    /**
    * 菜单图标
    */
    private String icon;
    
    private Long createBy;
    
    private Date createTime;
    
    private Long updateBy;
    
    private Date updateTime;
    /**
    * 是否删除(0未删除 1已删除)
    */
    private Integer delFlag;
    /**
    * 备注
    */
    private String remark;
}

标签:COMMENT,sys,NULL,DEFAULT,RBAC,role,SQL,建表及,id
From: https://www.cnblogs.com/wsfj/p/17346101.html

相关文章

  • 关于sql server数据库本地连接失败的问题的解决
    问题描述打开SQLServer使用时,需要连接到本地数据库;但是一直显示连接本地数据库失败;问题解决右键管理->服务与应用程序->服务->找到这个:右键打开它,再次连接,就能够成功运行啦!......
  • MySQL安装
    MySQLjavaEE:企业级java开发Web前端后台数据库安装Mysqlmysql5.7.33安装网站:https://dev.mysql.com/downloads/mysql/解压放到环境目录下添加环境变量path--->添加mysql下的bin目录新建mysql配置文件my.ini[mysqld]#目录换成自己的basedir=D:\Environmen......
  • sql注入getshell的几种方式
    文章目录一.intooutfile利用条件写入webshell二.--os-shell--sql-shell    介绍几种利用sql注入获取系统权限的方法,一是利用outfile函数,另外一种是利用--os-shell。一.intooutfile  利用条件:    1.此方法利用的先决条件web目录具有写权限,能够......
  • 06期:使用 OPTIMIZER_TRACE 窥探 MySQL 索引选择的秘密
    这里记录的是学习分享内容,文章维护在Github:studeyang/leanrning-share。优化查询语句的性能是MySQL数据库管理中的一个重要方面。在优化查询性能时,选择正确的索引对于减少查询的响应时间和提高系统性能至关重要。但是,如何确定MySQL的索引选择策略?MySQL的优化器是如何选择索......
  • MySQL中的 distinct 和 group by 哪个效率更高?
    在语义相同,有索引的情况下:groupby和distinct都能使用索引,效率相同。因为groupby和distinct近乎等价,distinct可以被看做是特殊的groupby。在语义相同,无索引的情况下:distinct效率高于groupby。原因是distinct和groupby都会进行分组操作,但groupby在Mysql8.0之前会进行隐式......
  • mysql索引学习
    概念:是一种高效获取数据的数据结构(有序)索引结构二叉树红黑树hashbtree,叶子节点存数据,一个页占用数据大,层级结构就多b+tree,非叶子节点存储数据,mysql做了优化,双向链表索引分类:主键索引、唯一索引、常规索引、全文索引聚集索引、非聚集索引通过命令查询增删改查执行次数......
  • Microsoft SQL Server安装2022
    https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads用的第三个 注册,填完就可以下载。选择位置左边按安装,右边按最上面一个:全新sql 我们默认下一步 中间有几页,同样是下一步,第二次安装,没有显示了。将适用于sql的反选后下一步选择功能,位置。......
  • Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能
    索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响,这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁,从而使性能下降。为此,可以采取以下几种方式来减缓这种影响: 1.限制索引的大小:可以考虑为索引指定大小限制,在存储时仅存储指定大小内的数据。例如,在......
  • mysql replace 正则替换
    先说结论:8.0版本之前不支持,只能采用曲线方法,例如:UPDATEtestsettest.data=REPLACE(test.data,SUBSTR(test.data,LOCATE("{",test.data),LOCATE("}",test.data)),"") 8.0之后使用REGEXP_REPLACE函数UPDATEtableNameset`name`=REGEXP_REPLACE(`name`,'......
  • mysql字段过长无法作为约束、索引的解决方案
    背景:对接过程中遇到一个场景 需要用(网页链接+请求id)作为唯一约束,由于url很长,我在一开始就设置为了text字段。ALTERTABLExxx.xxxADDCONSTRAINTxxxUNIQUEKEY(xxxx);在加约束时报错:SQL错误[1170][42000]:BLOB/TEXTcolumn'xxxx'usedinkeyspecificationwith......