SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)

文章目录

    • 获取用户角色权限信息实现
      • 用户角色权限的sql初始化语句
        • 5张数据表的如下:
        • 通过MybatisX插件将对应的模块的三层接口生成
          • 面向对象思想编程
            • 基类对象BaseEntity的创建
            • 编写时间对象CustomDateTimeSerializer进行解析处理(时间需要进行处理)
            • 最后在几个实体对象中先继承自BaseEntity,并将对象中的几个重复属性进行注释或者删除即可
      • 修改自定义登录逻辑中的获取权限信息
        • 修改common包下的MyUserDetailsServiceImpl类对象的权限列表代码
          • 注意需要修改MyJwtAuthenticationFilter过滤器中的用户编号查询权限列表的方法
        • service业务层的编写
          • service实现类代码:
        • 查询的sql演变:
            • 分别启动服务器进行登录测试,查看控制台的用户权限是否正确
            • 此时控制器中的请求,只要登录了就可以进行访问
    • 请求方法上注解的使用
        • 1、在请求方法上添加必须拥有某个角色才能请求进来的注解
        • 2、在请求方法上添加必须拥有某个权限才能请求进来的注解
    • 登录页面的记住密码功能实现
        • 实现思路
          • 这里有三种方法来存储账号密码:
          • 在util目录下新建jsencrypt.js
          • 在需要使用记住密码的vue页面【Login.vue】中引入
            • 修改声明以及数据绑定
            • 在登录处理函数中,添加逻辑代码
            • 添加从Cookies中获得账户和解密后密码的函数
            • 访问登录页面,在登录的时间勾选记住密码复选框,下次请求登录时可以看到已经记住了账号信息
    • 小结

获取用户角色权限信息实现

提示:这里需要先把用户角色权限信息表的处理,基本的用户角色权限通过五张基础的数据表的实现,分别是 用户信息表、角色信息表、权限信息表、用户角色信息表、角色权限信息表

用户角色权限的sql初始化语句

/*
 Navicat Premium Data Transfer

 Source Server         : 2003
 Source Server Type    : MySQL
 Source Server Version : 50527 (5.5.27)
 Source Host           : localhost:3306
 Source Schema         : security_vue3

 Target Server Type    : MySQL
 Target Server Version : 50527 (5.5.27)
 File Encoding         : 65001

 Date: 27/12/2023 22:35:04
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单主键ID',
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单名称',
  `icon` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '#' COMMENT '菜单图标',
  `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父菜单ID',
  `order_num` int(11) NULL DEFAULT 0 COMMENT '显示顺序',
  `path` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '路由地址',
  `component` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件路径',
  `menu_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',
  `perms` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '权限标识',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 34 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of sys_menu
-- ----------------------------
INSERT INTO `sys_menu` VALUES (1, '系统管理', 'system', 0, 1, '/sys', '', 'M', '', '2023-11-04 14:56:29', '2023-11-04 14:56:29', '系统管理目录');
INSERT INTO `sys_menu` VALUES (2, '业务管理', 'monitor', 0, 2, '/bsns', '', 'M', '', '2023-11-04 14:56:29', '2023-11-04 14:56:29', '业务管理目录');
INSERT INTO `sys_menu` VALUES (3, '用户管理', 'user', 1, 1, '/sys/user', 'sys/user/index', 'C', 'system:user:list', '2023-11-04 14:56:29', '2023-11-04 14:56:29', '用户管理菜单');
INSERT INTO `sys_menu` VALUES (4, '角色管理', 'peoples', 1, 2, '/sys/role', 'sys/role/index', 'C', 'system:role:list', '2023-11-04 14:56:29', '2023-11-04 14:56:29', '角色管理菜单');
INSERT INTO `sys_menu` VALUES (5, '菜单管理', 'tree-table', 1, 3, '/sys/menu', 'sys/menu/index', 'C', 'system:menu:list', '2023-11-04 14:56:30', '2023-11-04 14:56:30', '菜单管理菜单');
INSERT INTO `sys_menu` VALUES (6, '部门管理', 'tree', 2, 1, '/bsns/department', 'bsns/Department', 'C', '', '2023-11-04 14:56:31', '2023-11-04 14:56:31', '部门管理菜单');
INSERT INTO `sys_menu` VALUES (7, '岗位管理', 'post', 2, 2, '/bsns/post', 'bsns/Post', 'C', '', '2023-11-04 14:56:32', '2023-11-04 14:56:32', '岗位管理菜单');
INSERT INTO `sys_menu` VALUES (8, '用户新增', '#', 3, 2, '', '', 'F', 'system:user:add', '2023-11-04 14:56:33', '2023-11-04 14:56:33', '添加用户按钮');
INSERT INTO `sys_menu` VALUES (9, '用户修改', '#', 3, 3, '', '', 'F', 'system:user:edit', '2023-11-04 14:56:34', '2023-11-04 14:56:34', '修改用户按钮');
INSERT INTO `sys_menu` VALUES (10, '用户删除', '#', 3, 4, '', '', 'F', 'system:user:delete', '2023-11-04 14:56:35', '2023-11-04 14:56:35', '删除用户按钮');
INSERT INTO `sys_menu` VALUES (11, '分配角色', '#', 3, 5, '', '', 'F', 'system:user:role', '2023-11-04 14:56:36', '2023-11-04 14:56:36', '分配角色按钮');
INSERT INTO `sys_menu` VALUES (12, '重置密码', '#', 3, 6, '', '', 'F', 'system:user:resetPwd', '2023-11-04 14:56:37', '2023-11-04 14:56:37', '重置密码按钮');
INSERT INTO `sys_menu` VALUES (13, '角色新增', '#', 4, 2, '', '', 'F', 'system:role:add', '2023-11-04 14:56:37', '2023-11-04 14:56:37', '添加用户按钮');
INSERT INTO `sys_menu` VALUES (14, '角色修改', '#', 4, 3, '', '', 'F', 'system:role:edit', '2023-11-04 14:56:38', '2023-11-04 14:56:37', '修改用户按钮');
INSERT INTO `sys_menu` VALUES (15, '角色删除', '#', 4, 4, '', NULL, 'F', 'system:role:delete', '2023-11-04 14:56:39', '2023-11-04 14:56:39', '删除用户按钮');
INSERT INTO `sys_menu` VALUES (16, '分配权限', '#', 4, 5, '', '', 'F', 'system:role:menu', '2023-11-04 14:56:40', '2023-11-04 14:56:40', '分配权限按钮');
INSERT INTO `sys_menu` VALUES (17, '菜单新增', '#', 5, 2, '', NULL, 'F', 'system:menu:add', '2023-11-04 14:56:40', '2023-11-04 14:56:40', '添加菜单按钮');
INSERT INTO `sys_menu` VALUES (18, '菜单修改', '#', 5, 3, '', NULL, 'F', 'system:menu:edit', '2023-11-04 14:56:41', '2023-11-04 14:56:41', '修改菜单按钮');
INSERT INTO `sys_menu` VALUES (19, '菜单删除', '#', 5, 4, '', NULL, 'F', 'system:menu:delete', '2023-11-04 14:56:41', '2023-11-04 14:56:41', '删除菜单按钮');
INSERT INTO `sys_menu` VALUES (20, '用户查询', '#', 3, 1, '', NULL, 'F', 'system:user:query', '2023-11-04 14:56:42', '2023-11-04 14:56:42', '用户查询按钮');
INSERT INTO `sys_menu` VALUES (21, '角色查询', '#', 4, 1, '', NULL, 'F', 'system:role:query', '2023-11-04 14:56:43', '2023-11-04 14:56:43', '角色查询按钮');
INSERT INTO `sys_menu` VALUES (22, '菜单查询', '#', 5, 1, '', NULL, 'F', 'system:menu:query', '2023-11-04 14:56:45', '2023-11-04 14:56:45', '菜单查询按钮');
INSERT INTO `sys_menu` VALUES (33, '测速22', '122', 3, 3, '', '34', 'M', '33', '2023-11-04 14:56:46', '2023-11-04 14:56:46', '测试管理目录');

-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色主键ID',
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色名称',
  `code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色权限字符串',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', '2023-11-04 14:40:44', '2023-11-04 14:40:47', '拥有系统最高权限');
INSERT INTO `sys_role` VALUES (2, '普通角色', 'common', '2023-11-04 14:41:56', '2023-11-04 14:41:58', '普通角色');
INSERT INTO `sys_role` VALUES (3, '测试角色', 'test', '2023-11-04 14:42:24', '2023-11-04 14:42:27', '测试角色');
INSERT INTO `sys_role` VALUES (4, '2', NULL, NULL, NULL, NULL);
INSERT INTO `sys_role` VALUES (5, '3', NULL, NULL, NULL, NULL);
INSERT INTO `sys_role` VALUES (6, '4', NULL, NULL, NULL, NULL);
INSERT INTO `sys_role` VALUES (7, '5', NULL, NULL, NULL, NULL);
INSERT INTO `sys_role` VALUES (14, '6', NULL, NULL, NULL, NULL);
INSERT INTO `sys_role` VALUES (16, '8', NULL, NULL, NULL, NULL);
INSERT INTO `sys_role` VALUES (17, '0', NULL, NULL, NULL, NULL);
INSERT INTO `sys_role` VALUES (19, '测2', 'cc2', '2023-11-13 21:06:21', '2023-11-13 13:06:27', 'eewew2');
INSERT INTO `sys_role` VALUES (20, 'ccc测试', 'test2', '2023-11-29 17:10:33', NULL, 'xxx');
INSERT INTO `sys_role` VALUES (21, '今天测试角色', 'todytest', '2023-11-29 22:01:11', NULL, 'ccc');

-- ----------------------------
-- Table structure for sys_role_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_role_menu`;
CREATE TABLE `sys_role_menu`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色菜单主键ID',
  `role_id` bigint(20) NULL DEFAULT NULL COMMENT '角色ID',
  `menu_id` bigint(20) NULL DEFAULT NULL COMMENT '菜单ID',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 239 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of sys_role_menu
-- ----------------------------
INSERT INTO `sys_role_menu` VALUES (8, 2, 1);
INSERT INTO `sys_role_menu` VALUES (9, 2, 2);
INSERT INTO `sys_role_menu` VALUES (10, 2, 3);
INSERT INTO `sys_role_menu` VALUES (11, 2, 4);
INSERT INTO `sys_role_menu` VALUES (12, 2, 5);
INSERT INTO `sys_role_menu` VALUES (13, 2, 6);
INSERT INTO `sys_role_menu` VALUES (14, 2, 7);
INSERT INTO `sys_role_menu` VALUES (15, 3, 2);
INSERT INTO `sys_role_menu` VALUES (16, 3, 6);
INSERT INTO `sys_role_menu` VALUES (17, 3, 7);
INSERT INTO `sys_role_menu` VALUES (21, 7, 1);
INSERT INTO `sys_role_menu` VALUES (22, 7, 2);
INSERT INTO `sys_role_menu` VALUES (23, 7, 6);
INSERT INTO `sys_role_menu` VALUES (24, 7, 7);
INSERT INTO `sys_role_menu` VALUES (25, 6, 1);
INSERT INTO `sys_role_menu` VALUES (26, 6, 3);
INSERT INTO `sys_role_menu` VALUES (27, 6, 9);
INSERT INTO `sys_role_menu` VALUES (28, 6, 10);
INSERT INTO `sys_role_menu` VALUES (29, 19, 1);
INSERT INTO `sys_role_menu` VALUES (30, 19, 3);
INSERT INTO `sys_role_menu` VALUES (31, 19, 2);
INSERT INTO `sys_role_menu` VALUES (32, 19, 6);
INSERT INTO `sys_role_menu` VALUES (33, 1, 1);
INSERT INTO `sys_role_menu` VALUES (34, 1, 3);
INSERT INTO `sys_role_menu` VALUES (35, 1, 20);
INSERT INTO `sys_role_menu` VALUES (36, 1, 8);
INSERT INTO `sys_role_menu` VALUES (37, 1, 9);
INSERT INTO `sys_role_menu` VALUES (38, 1, 10);
INSERT INTO `sys_role_menu` VALUES (39, 1, 11);
INSERT INTO `sys_role_menu` VALUES (40, 1, 12);
INSERT INTO `sys_role_menu` VALUES (41, 1, 4);
INSERT INTO `sys_role_menu` VALUES (42, 1, 21);
INSERT INTO `sys_role_menu` VALUES (43, 1, 13);
INSERT INTO `sys_role_menu` VALUES (44, 1, 14);
INSERT INTO `sys_role_menu` VALUES (45, 1, 15);
INSERT INTO `sys_role_menu` VALUES (46, 1, 16);
INSERT INTO `sys_role_menu` VALUES (47, 1, 23);
INSERT INTO `sys_role_menu` VALUES (48, 1, 5);
INSERT INTO `sys_role_menu` VALUES (49, 1, 22);
INSERT INTO `sys_role_menu` VALUES (50, 1, 17);
INSERT INTO `sys_role_menu` VALUES (51, 1, 18);
INSERT INTO `sys_role_menu` VALUES (52, 1, 19);
INSERT INTO `sys_role_menu` VALUES (53, 1, 2);
INSERT INTO `sys_role_menu` VALUES (54, 1, 6);
INSERT INTO `sys_role_menu` VALUES (55, 1, 7);
INSERT INTO `sys_role_menu` VALUES (208, 20, 1);
INSERT INTO `sys_role_menu` VALUES (209, 20, 3);
INSERT INTO `sys_role_menu` VALUES (210, 20, 20);
INSERT INTO `sys_role_menu` VALUES (211, 20, 8);
INSERT INTO `sys_role_menu` VALUES (212, 20, 9);
INSERT INTO `sys_role_menu` VALUES (213, 20, 33);
INSERT INTO `sys_role_menu` VALUES (214, 20, 10);
INSERT INTO `sys_role_menu` VALUES (215, 20, 11);
INSERT INTO `sys_role_menu` VALUES (216, 20, 4);
INSERT INTO `sys_role_menu` VALUES (217, 20, 21);
INSERT INTO `sys_role_menu` VALUES (218, 20, 13);
INSERT INTO `sys_role_menu` VALUES (219, 20, 5);
INSERT INTO `sys_role_menu` VALUES (220, 20, 22);
INSERT INTO `sys_role_menu` VALUES (221, 20, 17);
INSERT INTO `sys_role_menu` VALUES (222, 20, 18);
INSERT INTO `sys_role_menu` VALUES (223, 20, 2);
INSERT INTO `sys_role_menu` VALUES (224, 20, 6);
INSERT INTO `sys_role_menu` VALUES (225, 20, 7);
INSERT INTO `sys_role_menu` VALUES (232, 21, 1);
INSERT INTO `sys_role_menu` VALUES (233, 21, 9);
INSERT INTO `sys_role_menu` VALUES (234, 21, 4);
INSERT INTO `sys_role_menu` VALUES (235, 21, 21);
INSERT INTO `sys_role_menu` VALUES (236, 21, 2);
INSERT INTO `sys_role_menu` VALUES (237, 21, 6);
INSERT INTO `sys_role_menu` VALUES (238, 21, 7);

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
  `password` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
  `avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'default.jpg' COMMENT '用户头像',
  `email` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用户邮箱',
  `phonenumber` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '手机号码',
  `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间',
  `status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 31 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (1, 'xuguoguo', '$2a$10$Kib4zuVhTzg3I1CoqJfd0unuY9G9ysI7cfbhyT3fi7k7Z/4pr3bGW', 'xuguoguo.jpg', '[email protected]', '18163615796', '2023-09-29 22:10:52', '0', '2023-09-09 08:47:52', '2023-09-22 08:47:54', '备注');
INSERT INTO `sys_user` VALUES (2, 'test', '$2a$10$Kib4zuVhTzg3I1CoqJfd0unuY9G9ysI7cfbhyT3fi7k7Z/4pr3bGW', 'default.jpg', '', '18937459285', '2023-09-30 18:47:01', '1', '2023-09-29 18:47:14', NULL, NULL);
INSERT INTO `sys_user` VALUES (3, 'test2', '$2a$10$tiArwm0GxChyEP5k0JGzsOuzyY15IKA.ZTl8S2aj3haYlKAfpwfl.', '333.jpg', '', '', '2023-11-24 17:36:07', '0', NULL, NULL, NULL);
INSERT INTO `sys_user` VALUES (4, '1', '$2a$10$lD0Fx7oMsFFmX9hVkmYy7eJteH8pBaXXro1X9DEMP5sbM.Z6Co55m', 'default.jpg', '', '', NULL, '1', NULL, NULL, NULL);
INSERT INTO `sys_user` VALUES (5, '2', NULL, 'default.jpg', '', '', NULL, '1', NULL, NULL, NULL);
INSERT INTO `sys_user` VALUES (15, 'fdsfs', '$2a$10$AQVcp4hQ7REc5o7ztVnI7eX.sJdcYy3d1x2jm5CfrcCoMZMPacfpi', 'default.jpg', '[email protected]', '18862851414', '2023-11-02 02:22:45', '1', '2023-11-02 02:21:24', '2023-11-01 18:23:16', '');
INSERT INTO `sys_user` VALUES (28, 'sdfss2', '$2a$10$7aNJxwVmefI0XAk64vrzYuOqeeImYJUQnoBrtKP9pLTGTWO2CXQ/y', 'default.jpg', '[email protected]', '18862857413', NULL, '1', '2023-11-07 00:42:46', '2023-11-06 16:43:04', '');
INSERT INTO `sys_user` VALUES (29, 'ccc', '$2a$10$7cbWeVwDWO9Hh3qbJrvTHOn0E/DLYXxnIZpxZei0jY4ChfQbJuhi.', 'default.jpg', '[email protected]', '18862584120', '2023-11-29 19:52:27', '0', '2023-11-29 17:04:58', NULL, '');
INSERT INTO `sys_user` VALUES (30, 'ccc666', '$2a$10$Tmw5VCM/K2vb837AZDYHQOqE3gPiRZKevxLsh/ozndpTSjdwABqaK', 'default.jpg', '[email protected]', '18865259845', '2023-11-29 22:05:18', '0', '2023-11-29 22:00:39', NULL, '');

-- ----------------------------
-- Table structure for sys_user_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户角色主键ID',
  `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户ID',
  `role_id` bigint(20) NULL DEFAULT NULL COMMENT '角色ID',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of sys_user_role
-- ----------------------------
INSERT INTO `sys_user_role` VALUES (1, 1, 1);
INSERT INTO `sys_user_role` VALUES (2, 2, 2);
INSERT INTO `sys_user_role` VALUES (4, 1, 2);
INSERT INTO `sys_user_role` VALUES (6, 3, 3);
INSERT INTO `sys_user_role` VALUES (7, 3, 2);
INSERT INTO `sys_user_role` VALUES (9, 4, 3);
INSERT INTO `sys_user_role` VALUES (10, 5, 3);
INSERT INTO `sys_user_role` VALUES (11, 15, 3);
INSERT INTO `sys_user_role` VALUES (16, 28, 2);
INSERT INTO `sys_user_role` VALUES (17, 28, 3);
INSERT INTO `sys_user_role` VALUES (20, 29, 20);
INSERT INTO `sys_user_role` VALUES (21, 30, 17);
INSERT INTO `sys_user_role` VALUES (22, 30, 21);

SET FOREIGN_KEY_CHECKS = 1;

5张数据表的如下:
  • 用户信息表sys_user
  • 角色信息表sys_role
  • 权限信息表sys_menu
  • 用户角色信息表sys_user_role
  • 角色权限信息表sys_role_menu

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第1张图片

通过MybatisX插件将对应的模块的三层接口生成

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第2张图片

面向对象思想编程

仔细观察每个实体对象,发现多个对象中的属性【数据表的列】都是相同的
如:id、create_time、update_time、create_user、update_user、remark,所以我们可以创建一个通用基础实体类对象,
然后让其他类去继承这个基类对象即可,这样的话方便程序的维护。

基类对象BaseEntity的创建
package com.xuguoguo.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * 公共基础实体类
 * @author xuguoguo
 */
@Data
public class BaseEntity implements Serializable {

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 创建日期
     */
    @JsonSerialize(using=CustomDateTimeSerializer.class)
    @JsonFormat(pattern ="yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 更新日期
     */
    @JsonSerialize(using=CustomDateTimeSerializer.class)
    @JsonFormat(pattern ="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    /**
     * 备注
     */
    private String remark;

}
编写时间对象CustomDateTimeSerializer进行解析处理(时间需要进行处理)
package com.xuguoguo.entity;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * 自定义返回JSON 数据格式中日期格式化处理
 * @author xuguoguo
 *
 */
public class CustomDateTimeSerializer extends JsonSerializer<Date>{

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers)
          throws IOException {
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
       gen.writeString(sdf.format(value));  
    }

}
最后在几个实体对象中先继承自BaseEntity,并将对象中的几个重复属性进行注释或者删除即可

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第3张图片
SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第4张图片

修改自定义登录逻辑中的获取权限信息

修改common包下的MyUserDetailsServiceImpl类对象的权限列表代码

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第5张图片

注意需要修改MyJwtAuthenticationFilter过滤器中的用户编号查询权限列表的方法

service业务层的编写

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第6张图片
SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第7张图片

service实现类代码:
package com.xuguoguo.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xuguoguo.entity.SysMenu;
import com.xuguoguo.entity.SysRole;
import com.xuguoguo.entity.SysUser;
import com.xuguoguo.mapper.SysMenuMapper;
import com.xuguoguo.mapper.SysRoleMapper;
import com.xuguoguo.service.SysUserService;
import com.xuguoguo.mapper.SysUserMapper;
import com.xuguoguo.utils.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
* @author xuguoguo
* @description 针对表【sys_user】的数据库操作Service实现
* @createDate 2023-12-05 20:20:08
*/
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
    implements SysUserService{

    @Autowired
    private SysRoleMapper sysRoleMapper;

    @Autowired
    private SysMenuMapper sysMenuMapper;

    @Override
    public String getUserAuthority(Long userId) {
        StringBuffer authority = new StringBuffer();
        //根据用户id获取所有的角色信息
//        角色信息 ROLE_admin、ROLE_common
//        权限信息 system:user:query、system:role:query、system:user:list
        List<SysRole> roleList = sysRoleMapper.selectList(new QueryWrapper<SysRole>().inSql("id",
                "select role_id from sys_user_role where user_id=" + userId));
        if (roleList.size()>0) {
            String roleCode = roleList.stream().map(r -> "ROLE_" + r.getCode()).collect(Collectors.joining(","));
            authority.append(roleCode);
        }
        //遍历所有的角色,获取所有的权限信息并且不重复
        Set<String> menuCodeSet = new HashSet<>();
        for (SysRole role : roleList) {
            List<SysMenu> menuList = sysMenuMapper.selectList(new QueryWrapper<SysMenu>().inSql("id",
                    "select menu_id from sys_role_menu where role_id=" + role.getId()));
            for (SysMenu menu : menuList) {
                String perms = menu.getPerms();
                if (StringUtil.isNotEmpty(perms)) {
                    menuCodeSet.add(perms);
                }
            }
        }
        if (menuCodeSet.size()>0) {
            authority.append(",");
            String menuCode = menuCodeSet.stream().collect(Collectors.joining(","));
            authority.append(menuCode);
        }
        System.out.println("authority:"+authority.toString());
        return authority.toString();
    }

    @Override
    public SysUser getByUsername(String username) {
        return getOne(new QueryWrapper<SysUser>().eq("username",username));
    }
}
查询的sql演变:

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第8张图片
SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第9张图片

分别启动服务器进行登录测试,查看控制台的用户权限是否正确

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第10张图片

此时控制器中的请求,只要登录了就可以进行访问

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第11张图片
SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第12张图片

请求方法上注解的使用

1、在请求方法上添加必须拥有某个角色才能请求进来的注解
@PreAuthorize("hasRole('ROLE_admin22')")

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第13张图片

这样的话会经过全局的异常处理器进行返回【返回的数据可以自行修改哦】

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第14张图片
SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第15张图片

2、在请求方法上添加必须拥有某个权限才能请求进来的注解
@PreAuthorize("hasAuthority('system:test:aa')")

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第16张图片

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第17张图片
SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第18张图片

登录页面的记住密码功能实现

实现思路

用户登录时若勾选“记住我”功能选项,则将登录名和密码(加密后)保存至本地缓存中,下次登录页面加载时自动获取保存好的账号和密码(需解密),回显到登录输入框中。

这里有三种方法来存储账号密码:
  • 1.sessionStorage(不推荐)
    • 1). 仅在当前会话下有效,关闭浏览器窗口后就被清除了
    • 2). 存放数据大小一般为5MB
    • 3). 不与服务器进行交互通信
  • 2.localStorage
    • 1). 除非主动清除localStorage里的信息,否则将永远存在,关闭浏览器窗口后下次启动任然存在
    • 2). 存放数据大小一般为5MB
    • 3). 不与服务器进行交互通信
  • 3.cookies
    • 1). 可以手动设置过期时间,超过有效期则失效。未设置过期时间,关闭浏览器窗口后就被清除了
    • 2). 存放数据大小一般为4K
    • 3). 每次请求都会被传送到服务器

早期这种功能性操作我们都是使用的cookie来保存在客户端浏览器进行存储,然后进行回显即可
这里我们需要安装依赖【js-cookie】来处理实现
存储用户密码,为了安全需要进行加密处理,获取密码解密操作,需要安装依赖【jsencrypt】

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第19张图片
SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第20张图片

在util目录下新建jsencrypt.js
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'

// 密钥对生成 http://web.chacuo.net/netrsakeypair

const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
    'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='

const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
    '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
    'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
    'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
    'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
    'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
    'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
    'UP8iWi1Qw0Y='

// 加密
export function encrypt(txt) {
    const encryptor = new JSEncrypt()
    encryptor.setPublicKey(publicKey) // 设置公钥
    return encryptor.encrypt(txt) // 对数据进行加密
}

// 解密
export function decrypt(txt) {
    const encryptor = new JSEncrypt()
    encryptor.setPrivateKey(privateKey) // 设置私钥
    return encryptor.decrypt(txt) // 对数据进行解密
}
在需要使用记住密码的vue页面【Login.vue】中引入

在这里插入图片描述

import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/util/jsencrypt";
修改声明以及数据绑定

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第21张图片

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第22张图片

在登录处理函数中,添加逻辑代码

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第23张图片

if (loginForm.value.rememberMe) {
          //勾选了需要记住密码设置在cookkie中设置记住用户名和密码【单位是天】
          Cookies.set("username", loginForm.value.username, { expires: 30 });
          Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 });
          Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 });
    } else {
      // 否则移除
      Cookies.remove("username");
      Cookies.remove("password");
      Cookies.remove("rememberMe");
    }
添加从Cookies中获得账户和解密后密码的函数
//获取cookie的函数
  function getCookie() {
      const username = Cookies.get("username");
      const password = Cookies.get("password");
      const rememberMe = Cookies.get("rememberMe");
      loginForm.value = {
        username: username === undefined ? loginForm.value.username : username,
        password: password === undefined ? loginForm.value.password :decrypt(password),
        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
      };
  }
  //调用获取cookie
  getCookie();
访问登录页面,在登录的时间勾选记住密码复选框,下次请求登录时可以看到已经记住了账号信息

小结

提示:本小结中主体实现的是使用数据库的用户信息实现登录,通过面向对象的编程思想实现代码的抽取base类对象以及登录页面的记住密码的实现引导处理!!!

本章的第五小节完毕,敬请期待后续更新(可留言需要学习哪方面的内容哈)!如果需要源码或者工具的朋友们可关注微信公众号"锅锅编程生活"或者扫描二维码关注回复关键字/后台留言获取即可!

SpringBoot+SpringSecurity+MybatisPlus+Vue3小项目摘录(五)_第24张图片

你可能感兴趣的:(SpringSecurity,SpringBoot,MybatisPlus,spring,boot,后端,java,mysql,mvc,restful)