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, Specification { +public interface PermissionDao extends JpaRepository, JpaSpecificationExecutor { + + /** + * 根据角色列表查询权限列表 + * + * @param ids 角色id列表 + * @return 权限列表 + */ + @Query(value = "SELECT DISTINCT sec_permission.* FROM sec_permission,sec_role,sec_role_permission WHERE sec_role.id = sec_role_permission.role_id AND sec_permission.id = sec_role_permission.permission_id AND sec_role.id IN (:ids)", nativeQuery = true) + List selectByRoleIdList(List ids); } diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/RoleDao.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/RoleDao.java index c5cbaeb..8e8357c 100644 --- a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/RoleDao.java +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/RoleDao.java @@ -1,8 +1,11 @@ package com.xkcoding.rbac.security.repository; import com.xkcoding.rbac.security.model.Role; -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,13 @@ import org.springframework.data.jpa.repository.JpaRepository; * @version: V1.0 * @modified: yangkai.shen */ -public interface RoleDao extends JpaRepository, Specification { +public interface RoleDao extends JpaRepository, JpaSpecificationExecutor { + /** + * 根据用户id 查询角色列表 + * + * @param userId 用户id + * @return 角色列表 + */ + @Query(value = "SELECT sec_role.* FROM sec_role,sec_user,sec_user_role WHERE sec_user.id = sec_user_role.user_id AND sec_role.id = sec_user_role.role_id AND sec_user.id = :userId", nativeQuery = true) + List selectByUserId(Long userId); } diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/RolePermissionDao.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/RolePermissionDao.java new file mode 100644 index 0000000..21e7491 --- /dev/null +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/RolePermissionDao.java @@ -0,0 +1,22 @@ +package com.xkcoding.rbac.security.repository; + +import com.xkcoding.rbac.security.model.RolePermission; +import com.xkcoding.rbac.security.model.unionkey.RolePermissionKey; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** + *

+ * 角色-权限 DAO + *

+ * + * @package: com.xkcoding.rbac.security.repository + * @description: 角色-权限 DAO + * @author: yangkai.shen + * @date: Created in 2018-12-10 13:45 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +public interface RolePermissionDao extends JpaRepository, JpaSpecificationExecutor { +} diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/UserDao.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/UserDao.java index c485fb4..4750dbb 100644 --- a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/UserDao.java +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/UserDao.java @@ -1,8 +1,11 @@ package com.xkcoding.rbac.security.repository; +import com.xkcoding.rbac.security.model.Permission; import com.xkcoding.rbac.security.model.User; -import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import java.util.Optional; /** *

@@ -17,5 +20,14 @@ import org.springframework.data.jpa.repository.JpaRepository; * @version: V1.0 * @modified: yangkai.shen */ -public interface UserDao extends JpaRepository, Specification { +public interface UserDao extends JpaRepository, JpaSpecificationExecutor { + /** + * 根据用户名、邮箱、手机号查询用户 + * + * @param username 用户名 + * @param email 邮箱 + * @param phone 手机号 + * @return 用户信息 + */ + Optional findByUsernameOrEmailOrPhone(String username, String email, String phone); } diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/UserRoleDao.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/UserRoleDao.java new file mode 100644 index 0000000..e9d1f1f --- /dev/null +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/UserRoleDao.java @@ -0,0 +1,23 @@ +package com.xkcoding.rbac.security.repository; + +import com.xkcoding.rbac.security.model.UserRole; +import com.xkcoding.rbac.security.model.unionkey.UserRoleKey; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** + *

+ * 用户角色 DAO + *

+ * + * @package: com.xkcoding.rbac.security.repository + * @description: 用户角色 DAO + * @author: yangkai.shen + * @date: Created in 2018-12-10 11:24 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +public interface UserRoleDao extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/spring-boot-demo-rbac-security/src/main/resources/application.yml b/spring-boot-demo-rbac-security/src/main/resources/application.yml index 1d79910..fc104da 100644 --- a/spring-boot-demo-rbac-security/src/main/resources/application.yml +++ b/spring-boot-demo-rbac-security/src/main/resources/application.yml @@ -5,10 +5,10 @@ server: spring: datasource: hikari: - jdbc-url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 username: root password: root - driver-class-name: com.mysql.cj.jdbc.Driver + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 jpa: show-sql: true generate-ddl: false diff --git a/spring-boot-demo-rbac-security/src/test/java/com/xkcoding/rbac/security/repository/DataInitTest.java b/spring-boot-demo-rbac-security/src/test/java/com/xkcoding/rbac/security/repository/DataInitTest.java new file mode 100644 index 0000000..db6bb55 --- /dev/null +++ b/spring-boot-demo-rbac-security/src/test/java/com/xkcoding/rbac/security/repository/DataInitTest.java @@ -0,0 +1,137 @@ +package com.xkcoding.rbac.security.repository; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Snowflake; +import com.xkcoding.rbac.security.SpringBootDemoRbacSecurityApplicationTests; +import com.xkcoding.rbac.security.model.*; +import com.xkcoding.rbac.security.model.unionkey.RolePermissionKey; +import com.xkcoding.rbac.security.model.unionkey.UserRoleKey; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + *

+ * 数据初始化测试 + *

+ * + * @package: com.xkcoding.rbac.security.repository + * @description: 数据初始化测试 + * @author: yangkai.shen + * @date: Created in 2018-12-10 11:26 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +public class DataInitTest extends SpringBootDemoRbacSecurityApplicationTests { + @Autowired + private UserDao userDao; + + @Autowired + private RoleDao roleDao; + + @Autowired + private PermissionDao permissionDao; + + @Autowired + private UserRoleDao userRoleDao; + + @Autowired + private RolePermissionDao rolePermissionDao; + + @Autowired + private Snowflake snowflake; + + @Autowired + private BCryptPasswordEncoder encoder; + + @Test + public void initTest() { + init(); + } + + private void init() { + User admin = createUser(true); + User user = createUser(false); + + Role roleAdmin = createRole(true); + Role roleUser = createRole(false); + + createUserRoleRelation(admin.getId(), roleAdmin.getId()); + createUserRoleRelation(user.getId(), roleUser.getId()); + + // 页面权限 + Permission pagePerm = createPermission("/test", "测试页面", 1, null, 1, 0L); + // 按钮权限 + Permission btnQueryPerm = createPermission(null, "测试页面-查询", 2, "test:query", 1, pagePerm.getId()); + Permission btnPermInsert = createPermission(null, "测试页面-添加", 2, "test:insert", 2, pagePerm.getId()); + + createRolePermissionRelation(roleAdmin.getId(), pagePerm.getId()); + createRolePermissionRelation(roleUser.getId(), pagePerm.getId()); + createRolePermissionRelation(roleAdmin.getId(), btnQueryPerm.getId()); + createRolePermissionRelation(roleUser.getId(), btnQueryPerm.getId()); + createRolePermissionRelation(roleAdmin.getId(), btnPermInsert.getId()); + } + + private void createRolePermissionRelation(Long roleId, Long permissionId) { + RolePermission adminPage = new RolePermission(); + RolePermissionKey adminPageKey = new RolePermissionKey(); + adminPageKey.setRoleId(roleId); + adminPageKey.setPermissionId(permissionId); + adminPage.setId(adminPageKey); + rolePermissionDao.save(adminPage); + } + + private Permission createPermission(String href, String name, Integer type, String permission, Integer sort, Long parentId) { + // 页面权限 + Permission perm = new Permission(); + perm.setId(snowflake.nextId()); + perm.setHref(href); + perm.setName(name); + perm.setType(type); + perm.setPermission(permission); + perm.setSort(sort); + perm.setParentId(parentId); + permissionDao.save(perm); + return perm; + } + + private void createUserRoleRelation(Long userId, Long roleId) { + UserRole userRole = new UserRole(); + UserRoleKey key = new UserRoleKey(); + key.setUserId(userId); + key.setRoleId(roleId); + userRole.setId(key); + userRoleDao.save(userRole); + } + + private Role createRole(boolean isAdmin) { + Role role = new Role(); + role.setId(snowflake.nextId()); + role.setName(isAdmin ? "管理员" : "普通用户"); + role.setDescription(isAdmin ? "超级管理员" : "普通用户"); + role.setCreateTime(DateUtil.current(false)); + role.setUpdateTime(DateUtil.current(false)); + roleDao.save(role); + return role; + } + + private User createUser(boolean isAdmin) { + User user = new User(); + user.setId(snowflake.nextId()); + user.setUsername(isAdmin ? "role" : "user"); + user.setNickname(isAdmin ? "管理员" : "普通用户"); + user.setPassword(encoder.encode("123456")); + user.setBirthday(DateTime.of("1994-11-22", "yyyy-MM-dd").getTime()); + user.setEmail((isAdmin ? "role" : "user") + "@xkcoding.com"); + user.setPhone(isAdmin ? "17300000000" : "17300001111"); + user.setSex(1); + user.setStatus(1); + user.setCreateTime(DateUtil.current(false)); + user.setUpdateTime(DateUtil.current(false)); + userDao.save(user); + return user; + } + +}