From 86710c056d82535def0d6ef6dca0ef7fb4178456 Mon Sep 17 00:00:00 2001 From: "Yangkai.Shen" <237497819@qq.com> Date: Mon, 10 Dec 2018 14:51:45 +0800 Subject: [PATCH] =?UTF-8?q?:card=5Ffile=5Fbox:=20=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96RBAC=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sql/security.sql | 194 +++++++++++++----- ...SpringBootDemoRbacSecurityApplication.java | 13 ++ .../rbac/security/config/IdConfig.java | 30 +++ .../rbac/security/model/Permission.java | 6 +- .../rbac/security/model/RolePermission.java | 32 +++ .../rbac/security/model/UserRole.java | 32 +++ .../model/unionkey/RolePermissionKey.java | 38 ++++ .../security/model/unionkey/UserRoleKey.java | 38 ++++ .../security/repository/PermissionDao.java | 16 +- .../rbac/security/repository/RoleDao.java | 15 +- .../repository/RolePermissionDao.java | 22 ++ .../rbac/security/repository/UserDao.java | 16 +- .../rbac/security/repository/UserRoleDao.java | 23 +++ .../src/main/resources/application.yml | 4 +- .../security/repository/DataInitTest.java | 137 +++++++++++++ 15 files changed, 556 insertions(+), 60 deletions(-) create mode 100644 spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/IdConfig.java create mode 100644 spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/RolePermission.java create mode 100644 spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/UserRole.java create mode 100644 spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/unionkey/RolePermissionKey.java create mode 100644 spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/unionkey/UserRoleKey.java create mode 100644 spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/RolePermissionDao.java create mode 100644 spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/UserRoleDao.java create mode 100644 spring-boot-demo-rbac-security/src/test/java/com/xkcoding/rbac/security/repository/DataInitTest.java diff --git a/spring-boot-demo-rbac-security/sql/security.sql b/spring-boot-demo-rbac-security/sql/security.sql index 48f3b24..ac65e86 100644 --- a/spring-boot-demo-rbac-security/sql/security.sql +++ b/spring-boot-demo-rbac-security/sql/security.sql @@ -1,65 +1,161 @@ -# 用户表 -CREATE TABLE IF NOT EXISTS `sec_user` +/* + Navicat Premium Data Transfer + + Source Server : 本机 + Source Server Type : MySQL + Source Server Version : 50718 + Source Host : localhost:3306 + Source Schema : spring-boot-demo + + Target Server Type : MySQL + Target Server Version : 50718 + File Encoding : 65001 + + Date: 10/12/2018 14:46:38 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for sec_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sec_permission`; +CREATE TABLE `sec_permission` ( - `id` BIGINT(64) NOT NULL COMMENT '主键', - `username` VARCHAR(50) NOT NULL COMMENT '用户名', - `password` VARCHAR(60) NOT NULL COMMENT '密码', - `nickname` VARCHAR(255) DEFAULT NULL COMMENT '昵称', - `phone` VARCHAR(11) DEFAULT NULL COMMENT '手机', - `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱', - `birthday` BIGINT(13) DEFAULT NULL COMMENT '生日', - `sex` TINYINT(1) DEFAULT NULL COMMENT '性别,男-1,女-2', - `status` TINYINT(1) NOT NULL DEFAULT '1' COMMENT '状态,启用-1,禁用-0', - `create_time` BIGINT(13) NOT NULL COMMENT '创建时间', - `update_time` BIGINT(13) NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `username` (`username`), - UNIQUE KEY `phone` (`phone`), - UNIQUE KEY `email` (`email`) + `id` bigint(64) NOT NULL COMMENT '主键', + `name` varchar(50) NOT NULL COMMENT '权限名', + `href` varchar(1000) DEFAULT NULL COMMENT '页面地址', + `type` int(2) NOT NULL COMMENT '权限类型,页面-1,按钮-2', + `permission` varchar(50) DEFAULT NULL COMMENT '权限表达式', + `sort` int(11) NOT NULL COMMENT '排序', + `parent_id` bigint(64) NOT NULL COMMENT '父级id', + PRIMARY KEY (`id`) ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 COMMENT '用户表'; + DEFAULT CHARSET = utf8 COMMENT ='权限表'; -# 角色表 -CREATE TABLE IF NOT EXISTS `sec_role` +-- ---------------------------- +-- Records of sec_permission +-- ---------------------------- +BEGIN; +INSERT INTO `sec_permission` +VALUES (1072019441543417856, '测试页面', '/test', 1, NULL, 1, 0); +INSERT INTO `sec_permission` +VALUES (1072019441564389376, '测试页面-查询', NULL, 2, 'test:query', 1, 1072019441543417856); +INSERT INTO `sec_permission` +VALUES (1072019441576972288, '测试页面-添加', NULL, 2, 'test:insert', 2, 1072019441543417856); +COMMIT; + +-- ---------------------------- +-- Table structure for sec_role +-- ---------------------------- +DROP TABLE IF EXISTS `sec_role`; +CREATE TABLE `sec_role` ( - `id` BIGINT(64) NOT NULL COMMENT '主键', - `name` VARCHAR(50) NOT NULL COMMENT '角色名', - `description` VARCHAR(100) DEFAULT NULL COMMENT '描述', - `create_time` BIGINT(13) NOT NULL COMMENT '创建时间', - `update_time` BIGINT(13) NOT NULL COMMENT '更新时间', + `id` bigint(64) NOT NULL COMMENT '主键', + `name` varchar(50) NOT NULL COMMENT '角色名', + `description` varchar(100) DEFAULT NULL COMMENT '描述', + `create_time` bigint(13) NOT NULL COMMENT '创建时间', + `update_time` bigint(13) NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 COMMENT '角色表'; + DEFAULT CHARSET = utf8 COMMENT ='角色表'; + +-- ---------------------------- +-- Records of sec_role +-- ---------------------------- +BEGIN; +INSERT INTO `sec_role` +VALUES (1072019441480503296, '管理员', '超级管理员', 1544424326664, 1544424326664); +INSERT INTO `sec_role` +VALUES (1072019441501474816, '普通用户', '普通用户', 1544424326669, 1544424326669); +COMMIT; -# 权限表 -CREATE TABLE IF NOT EXISTS `sec_permission` +-- ---------------------------- +-- Table structure for sec_role_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sec_role_permission`; +CREATE TABLE `sec_role_permission` ( - `id` BIGINT(64) NOT NULL COMMENT '主键', - `name` VARCHAR(50) NOT NULL COMMENT '权限名', - `href` VARCHAR(1000) DEFAULT NULL COMMENT '页面地址', - `type` TINYINT(1) NOT NULL COMMENT '权限类型,页面-1,按钮-2', - `permission` VARCHAR(50) DEFAULT NULL COMMENT '权限表达式', - `sort` INT(11) NOT NULL COMMENT '排序', - `parent_id` BIGINT(64) NOT NULL COMMENT '父级id', - PRIMARY KEY (`id`) + `role_id` bigint(64) NOT NULL COMMENT '角色主键', + `permission_id` bigint(64) NOT NULL COMMENT '权限主键', + PRIMARY KEY (`role_id`, `permission_id`) ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 COMMENT '权限表'; + DEFAULT CHARSET = utf8 COMMENT ='角色权限关系表'; + +-- ---------------------------- +-- Records of sec_role_permission +-- ---------------------------- +BEGIN; +INSERT INTO `sec_role_permission` +VALUES (1072019441480503296, 1072019441543417856); +INSERT INTO `sec_role_permission` +VALUES (1072019441480503296, 1072019441564389376); +INSERT INTO `sec_role_permission` +VALUES (1072019441480503296, 1072019441576972288); +INSERT INTO `sec_role_permission` +VALUES (1072019441501474816, 1072019441543417856); +INSERT INTO `sec_role_permission` +VALUES (1072019441501474816, 1072019441564389376); +COMMIT; -# 用户角色关系表 -CREATE TABLE IF NOT EXISTS `sec_user_role` +-- ---------------------------- +-- Table structure for sec_user +-- ---------------------------- +DROP TABLE IF EXISTS `sec_user`; +CREATE TABLE `sec_user` ( - `user_id` BIGINT(64) NOT NULL COMMENT '用户主键', - `role_id` BIGINT(64) NOT NULL COMMENT '角色主键', - PRIMARY KEY (`user_id`, `role_id`) + `id` bigint(64) NOT NULL COMMENT '主键', + `username` varchar(50) NOT NULL COMMENT '用户名', + `password` varchar(60) NOT NULL COMMENT '密码', + `nickname` varchar(255) DEFAULT NULL COMMENT '昵称', + `phone` varchar(11) DEFAULT NULL COMMENT '手机', + `email` varchar(50) DEFAULT NULL COMMENT '邮箱', + `birthday` bigint(13) DEFAULT NULL COMMENT '生日', + `sex` int(2) DEFAULT NULL COMMENT '性别,男-1,女-2', + `status` int(2) NOT NULL DEFAULT '1' COMMENT '状态,启用-1,禁用-0', + `create_time` bigint(13) NOT NULL COMMENT '创建时间', + `update_time` bigint(13) NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`), + UNIQUE KEY `phone` (`phone`), + UNIQUE KEY `email` (`email`) ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 COMMENT '用户角色关系表'; + DEFAULT CHARSET = utf8 COMMENT ='用户表'; + +-- ---------------------------- +-- Records of sec_user +-- ---------------------------- +BEGIN; +INSERT INTO `sec_user` +VALUES (1072019440205434880, 'role', '$2a$10$TwdumjYKUYRQvc3VC8dleOlWr4Q2TysQtfmCMplOWygOzyfrKQee2', '管理员', + '17300000000', 'role@xkcoding.com', 785433600000, 1, 1, 1544424326483, 1544424326483); +INSERT INTO `sec_user` +VALUES (1072019441035907072, 'user', '$2a$10$8hL7INOxQCzDzI08GGYNCOFKV6mjDcOqhJ/7c1VeF9agO.wBS3ylq', '普通用户', + '17300001111', 'user@xkcoding.com', 785433600000, 1, 1, 1544424326659, 1544424326659); +COMMIT; -# 角色权限关系表 -CREATE TABLE IF NOT EXISTS `sec_role_permission` +-- ---------------------------- +-- Table structure for sec_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `sec_user_role`; +CREATE TABLE `sec_user_role` ( - `role_id` BIGINT(64) NOT NULL COMMENT '角色主键', - `permission_id` BIGINT(64) NOT NULL COMMENT '权限主键', - PRIMARY KEY (`role_id`, `permission_id`) + `user_id` bigint(64) NOT NULL COMMENT '用户主键', + `role_id` bigint(64) NOT NULL COMMENT '角色主键', + PRIMARY KEY (`user_id`, `role_id`) ) ENGINE = InnoDB - DEFAULT CHARSET = utf8 COMMENT '角色权限关系表'; + DEFAULT CHARSET = utf8 COMMENT ='用户角色关系表'; + +-- ---------------------------- +-- Records of sec_user_role +-- ---------------------------- +BEGIN; +INSERT INTO `sec_user_role` +VALUES (1072019440205434880, 1072019441480503296); +INSERT INTO `sec_user_role` +VALUES (1072019441035907072, 1072019441501474816); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/SpringBootDemoRbacSecurityApplication.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/SpringBootDemoRbacSecurityApplication.java index 6bfecc3..5b8cef0 100644 --- a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/SpringBootDemoRbacSecurityApplication.java +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/SpringBootDemoRbacSecurityApplication.java @@ -3,6 +3,19 @@ package com.xkcoding.rbac.security; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +/** + *
+ * 启动器 + *
+ * + * @package: com.xkcoding.rbac.security + * @description: 启动器 + * @author: yangkai.shen + * @date: Created in 2018-12-10 11:28 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ @SpringBootApplication public class SpringBootDemoRbacSecurityApplication { diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/IdConfig.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/IdConfig.java new file mode 100644 index 0000000..d25738a --- /dev/null +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/IdConfig.java @@ -0,0 +1,30 @@ +package com.xkcoding.rbac.security.config; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.IdUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + *+ * 雪花主键生成器 + *
+ * + * @package: com.xkcoding.rbac.security.config + * @description: 雪花主键生成器 + * @author: yangkai.shen + * @date: Created in 2018-12-10 11:28 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Configuration +public class IdConfig { + /** + * 雪花生成器 + */ + @Bean + public Snowflake snowflake() { + return IdUtil.createSnowflake(1, 1); + } +} diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/Permission.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/Permission.java index 86c5d8d..93531c1 100644 --- a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/Permission.java +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/Permission.java @@ -43,7 +43,7 @@ public class Permission { /** * 权限类型,页面-1,按钮-2 */ - private String type; + private Integer type; /** * 权限表达式 @@ -53,11 +53,11 @@ public class Permission { /** * 排序 */ - private String sort; + private Integer sort; /** * 父级id */ @Column(name = "parent_id") - private String parentId; + private Long parentId; } diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/RolePermission.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/RolePermission.java new file mode 100644 index 0000000..3705d8f --- /dev/null +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/RolePermission.java @@ -0,0 +1,32 @@ +package com.xkcoding.rbac.security.model; + +import com.xkcoding.rbac.security.model.unionkey.RolePermissionKey; +import lombok.Data; + +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + *+ * 角色-权限 + *
+ * + * @package: com.xkcoding.rbac.security.model + * @description: 角色-权限 + * @author: yangkai.shen + * @date: Created in 2018-12-10 13:46 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Data +@Entity +@Table(name = "sec_role_permission") +public class RolePermission { + /** + * 主键 + */ + @EmbeddedId + private RolePermissionKey id; +} diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/UserRole.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/UserRole.java new file mode 100644 index 0000000..af38984 --- /dev/null +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/UserRole.java @@ -0,0 +1,32 @@ +package com.xkcoding.rbac.security.model; + +import com.xkcoding.rbac.security.model.unionkey.UserRoleKey; +import lombok.Data; + +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + *+ * 用户角色关联 + *
+ * + * @package: com.xkcoding.rbac.security.model + * @description: 用户角色关联 + * @author: yangkai.shen + * @date: Created in 2018-12-10 11:18 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Data +@Entity +@Table(name = "sec_user_role") +public class UserRole { + /** + * 主键 + */ + @EmbeddedId + private UserRoleKey id; +} diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/unionkey/RolePermissionKey.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/unionkey/RolePermissionKey.java new file mode 100644 index 0000000..8837ca8 --- /dev/null +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/unionkey/RolePermissionKey.java @@ -0,0 +1,38 @@ +package com.xkcoding.rbac.security.model.unionkey; + +import lombok.Data; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serializable; + +/** + *+ * 角色-权限联合主键 + *
+ * + * @package: com.xkcoding.rbac.security.model.unionkey + * @description: 角色-权限联合主键 + * @author: yangkai.shen + * @date: Created in 2018-12-10 13:47 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Data +@Embeddable +public class RolePermissionKey implements Serializable { + private static final long serialVersionUID = 6850974328279713855L; + + /** + * 角色id + */ + @Column(name = "role_id") + private Long roleId; + + /** + * 权限id + */ + @Column(name = "permission_id") + private Long permissionId; +} diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/unionkey/UserRoleKey.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/unionkey/UserRoleKey.java new file mode 100644 index 0000000..bc9d548 --- /dev/null +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/unionkey/UserRoleKey.java @@ -0,0 +1,38 @@ +package com.xkcoding.rbac.security.model.unionkey; + +import lombok.Data; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serializable; + +/** + *+ * 用户-角色联合主键 + *
+ * + * @package: com.xkcoding.rbac.security.model.unionkey + * @description: 用户-角色联合主键 + * @author: yangkai.shen + * @date: Created in 2018-12-10 11:20 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Embeddable +@Data +public class UserRoleKey implements Serializable { + private static final long serialVersionUID = 5633412144183654743L; + + /** + * 用户id + */ + @Column(name = "user_id") + private Long userId; + + /** + * 角色id + */ + @Column(name = "role_id") + private Long roleId; +} diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/PermissionDao.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/PermissionDao.java index 012f660..f8f30a7 100644 --- a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/PermissionDao.java +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/PermissionDao.java @@ -1,8 +1,11 @@ package com.xkcoding.rbac.security.repository; import com.xkcoding.rbac.security.model.Permission; -import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; /** *
@@ -17,5 +20,14 @@ import org.springframework.data.jpa.repository.JpaRepository;
* @version: V1.0
* @modified: yangkai.shen
*/
-public interface PermissionDao extends JpaRepository
@@ -17,5 +20,13 @@ import org.springframework.data.jpa.repository.JpaRepository;
* @version: V1.0
* @modified: yangkai.shen
*/
-public interface RoleDao extends JpaRepository
+ * 角色-权限 DAO
+ *
@@ -17,5 +20,14 @@ import org.springframework.data.jpa.repository.JpaRepository;
* @version: V1.0
* @modified: yangkai.shen
*/
-public interface UserDao extends JpaRepository
+ * 用户角色 DAO
+ *
+ * 数据初始化测试
+ *