785834757 1 gadu atpakaļ
revīzija
b50ee3e90a
60 mainītis faili ar 2341 papildinājumiem un 0 dzēšanām
  1. 38 0
      .gitignore
  2. 120 0
      authentication/dependency-reduced-pom.xml
  3. 70 0
      authentication/pom.xml
  4. 15 0
      authentication/src/main/java/com/jzg/AuthenticationApplication.java
  5. 63 0
      authentication/src/main/java/com/jzg/config/JzgAuthentication.java
  6. 67 0
      authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java
  7. 48 0
      authentication/src/main/java/com/jzg/config/JzgBCryptPasswordEncoder.java
  8. 21 0
      authentication/src/main/java/com/jzg/config/JzgGrantedAuthority.java
  9. 49 0
      authentication/src/main/java/com/jzg/config/JzgTokenService.java
  10. 61 0
      authentication/src/main/java/com/jzg/config/JzgUserDetails.java
  11. 26 0
      authentication/src/main/java/com/jzg/config/JzgUserDetailsService.java
  12. 79 0
      authentication/src/main/java/com/jzg/config/SecurityConfig.java
  13. 78 0
      authentication/src/main/java/com/jzg/controller/AuthController.java
  14. 13 0
      authentication/src/main/java/com/jzg/entity/RedisToken.java
  15. 13 0
      authentication/src/main/java/com/jzg/entity/SysUser.java
  16. 10 0
      authentication/src/main/java/com/jzg/entity/SysUserRole.java
  17. 19 0
      authentication/src/main/java/com/jzg/handler/JzgAuthenticationFailedHandler.java
  18. 61 0
      authentication/src/main/java/com/jzg/handler/JzgAuthenticationSuccessHandler.java
  19. 9 0
      authentication/src/main/java/com/jzg/mapper/SysUserMapper.java
  20. 9 0
      authentication/src/main/java/com/jzg/mapper/SysUserRoleMapper.java
  21. 12 0
      authentication/src/main/java/com/jzg/service/SysUserRoleService.java
  22. 9 0
      authentication/src/main/java/com/jzg/service/SysUserService.java
  23. 20 0
      authentication/src/main/java/com/jzg/service/impl/SysUserRoleServiceImpl.java
  24. 11 0
      authentication/src/main/java/com/jzg/service/impl/SysUserServiceImpl.java
  25. 118 0
      authentication/src/main/java/com/jzg/util/PasswordEncoder.java
  26. 44 0
      authentication/src/main/java/com/jzg/util/PasswordUtils.java
  27. 21 0
      authentication/src/main/resources/application.yml
  28. 20 0
      commons/pom.xml
  29. 12 0
      commons/src/main/java/com/jzg/aop/PremissionCheck.java
  30. 92 0
      commons/src/main/java/com/jzg/aop/aspect/PermissionAspect.java
  31. 31 0
      commons/src/main/java/com/jzg/config/RedissonConfig.java
  32. 8 0
      commons/src/main/java/com/jzg/constants/RedisKeyConstants.java
  33. 103 0
      commons/src/main/java/com/jzg/core/page/HttpResult.java
  34. 237 0
      commons/src/main/java/com/jzg/core/page/HttpStatus.java
  35. 45 0
      commons/src/main/java/com/jzg/entity/vo/RoleMenuVo.java
  36. 58 0
      commons/src/main/java/com/jzg/exception/GlobalExceptionHandler.java
  37. 28 0
      commons/src/main/java/com/jzg/exception/SystemException.java
  38. 40 0
      gateway/pom.xml
  39. 13 0
      gateway/src/main/java/com/jzg/GateWayApplication.java
  40. 17 0
      gateway/src/main/java/com/jzg/config/AopConfig.java
  41. 14 0
      gateway/src/main/java/com/jzg/config/GatewayConfig.java
  42. 33 0
      gateway/src/main/java/com/jzg/filter/AuthFilter.java
  43. 18 0
      gateway/src/main/resources/application.yml
  44. 48 0
      platform/pom.xml
  45. 15 0
      platform/src/main/java/com/jzg/PlatFormApplication.java
  46. 30 0
      platform/src/main/java/com/jzg/controller/UserRoleController.java
  47. 17 0
      platform/src/main/java/com/jzg/entity/po/SysMenu.java
  48. 15 0
      platform/src/main/java/com/jzg/entity/po/SysRole.java
  49. 13 0
      platform/src/main/java/com/jzg/entity/po/SysRoleMenu.java
  50. 14 0
      platform/src/main/java/com/jzg/entity/po/SysUserRole.java
  51. 34 0
      platform/src/main/java/com/jzg/event/PlatFormApplicationLister.java
  52. 9 0
      platform/src/main/java/com/jzg/mapper/SysMenuMapper.java
  53. 15 0
      platform/src/main/java/com/jzg/mapper/SysRoleMapper.java
  54. 9 0
      platform/src/main/java/com/jzg/mapper/SysRoleMenuMapper.java
  55. 9 0
      platform/src/main/java/com/jzg/mapper/SysUserRoleMapper.java
  56. 18 0
      platform/src/main/java/com/jzg/service/UserRoleService.java
  57. 19 0
      platform/src/main/java/com/jzg/service/impl/UserRoleServiceImpl.java
  58. 21 0
      platform/src/main/resources/application.yml
  59. 40 0
      platform/src/main/resources/mapper/SysRoleMapper.xml
  60. 142 0
      pom.xml

+ 38 - 0
.gitignore

@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store

+ 120 - 0
authentication/dependency-reduced-pom.xml

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <artifactId>jzg</artifactId>
+    <groupId>com.jzg</groupId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>authentication</artifactId>
+  <name>authentication Maven Webapp</name>
+  <url>http://maven.apache.org</url>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <version>8.0.26</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.baomidou</groupId>
+      <artifactId>mybatis-plus</artifactId>
+      <version>3.5.7</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.baomidou</groupId>
+      <artifactId>mybatis-plus-extension</artifactId>
+      <version>3.5.7</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.security</groupId>
+      <artifactId>spring-security-core</artifactId>
+      <version>6.2.6</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+      <version>1.18.24</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+      <version>3.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <version>3.0.0</version>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>spring-boot-test</artifactId>
+          <groupId>org.springframework.boot</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>spring-boot-test-autoconfigure</artifactId>
+          <groupId>org.springframework.boot</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>json-path</artifactId>
+          <groupId>com.jayway.jsonpath</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jakarta.xml.bind-api</artifactId>
+          <groupId>jakarta.xml.bind</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>assertj-core</artifactId>
+          <groupId>org.assertj</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>hamcrest</artifactId>
+          <groupId>org.hamcrest</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>junit-jupiter</artifactId>
+          <groupId>org.junit.jupiter</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>mockito-core</artifactId>
+          <groupId>org.mockito</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>mockito-junit-jupiter</artifactId>
+          <groupId>org.mockito</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jsonassert</artifactId>
+          <groupId>org.skyscreamer</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>spring-test</artifactId>
+          <groupId>org.springframework</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>xmlunit-core</artifactId>
+          <groupId>org.xmlunit</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-security</artifactId>
+      <version>3.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+</project>

+ 70 - 0
authentication/pom.xml

@@ -0,0 +1,70 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.jzg</groupId>
+        <artifactId>jzg</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>authentication</artifactId>
+    <packaging>jar</packaging>
+    <name>authentication Maven Webapp</name>
+    <url>http://maven.apache.org</url>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-extension</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-core</artifactId>
+            <version>6.2.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.security.oauth</groupId>
+            <artifactId>spring-security-oauth2</artifactId>
+            <version>2.3.3.RELEASE</version> <!-- 根据你的 Spring Boot 版本调整 -->
+        </dependency>
+
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>commons</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 15 - 0
authentication/src/main/java/com/jzg/AuthenticationApplication.java

@@ -0,0 +1,15 @@
+package com.jzg;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+
+@SpringBootApplication
+public class AuthenticationApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(AuthenticationApplication.class, args);
+    }
+
+}

+ 63 - 0
authentication/src/main/java/com/jzg/config/JzgAuthentication.java

@@ -0,0 +1,63 @@
+package com.jzg.config;
+
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+
+import java.util.Collection;
+import java.util.Collections;
+
+
+//  暂时无用
+public class JzgAuthentication implements Authentication {
+
+    private final String username;
+    private final Collection<? extends GrantedAuthority> authorities;
+    private boolean authenticated = false;
+    private String salt;
+
+    public JzgAuthentication(String username, Collection<? extends GrantedAuthority> authorities) {
+        this.username = username;
+        this.authorities = Collections.unmodifiableCollection(authorities); // Make authorities immutable
+    }
+    public void setSalt(String salt){
+        this.salt = salt;
+    }
+    public String getSalt(){
+        return salt;
+    }
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        return this.getAuthorities();
+    }
+
+    @Override
+    public Object getCredentials() {
+        return null;
+    }
+
+    @Override
+    public Object getDetails() {
+        return this.getDetails();
+    }
+
+    @Override
+    public Object getPrincipal() {
+        return null;
+    }
+
+    @Override
+    public boolean isAuthenticated() {
+        return false;
+    }
+
+    @Override
+    public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
+
+    }
+
+    @Override
+    public String getName() {
+        return null;
+    }
+}

+ 67 - 0
authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java

@@ -0,0 +1,67 @@
+package com.jzg.config;
+
+import com.jzg.entity.RedisToken;
+import com.jzg.entity.SysUserRole;
+import com.jzg.entity.SysUser;
+import com.jzg.service.SysUserRoleService;
+import com.jzg.service.SysUserService;
+import com.jzg.util.PasswordUtils;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetailsService;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class JzgAuthenticationProvider implements AuthenticationProvider {
+
+    private UserDetailsService userDetailsService;
+
+    private SysUserService sysUserService;
+
+    private SysUserRoleService sysUserRoleService;
+
+    public JzgAuthenticationProvider(UserDetailsService userDetailsService,SysUserService sysUserService, SysUserRoleService sysUserRoleService) {
+        this.userDetailsService = userDetailsService;
+        this.sysUserService = sysUserService;
+        this.sysUserRoleService = sysUserRoleService;
+    }
+
+
+    @Override
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        // 获取用户名和密码
+        String username = authentication.getName();
+        String rawPassword = (String) authentication.getCredentials();
+        Object details = authentication.getDetails();
+
+        SysUser byId = sysUserService.getById(username);
+        String salt = byId.getSalt();
+
+        // 加密密码和盐值
+        String encryptedPassword = PasswordUtils.encode(rawPassword,salt);
+
+        // 对比密码
+        if (!encryptedPassword.equals(byId.getPassword())) {
+            throw new BadCredentialsException("Invalid username or password");
+        }
+        //获取角色组
+        List<SysUserRole> userRoles = sysUserRoleService.getUserRole(username);
+
+        List<JzgGrantedAuthority> authorities = userRoles.stream()
+                .map(role -> new JzgGrantedAuthority("JZG",role.getRoleId()))
+                .collect(Collectors.toList());
+
+        return new UsernamePasswordAuthenticationToken(username, rawPassword, authorities);
+    }
+
+
+    @Override
+    public boolean supports(Class<?> authentication) {
+        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
+    }
+}

+ 48 - 0
authentication/src/main/java/com/jzg/config/JzgBCryptPasswordEncoder.java

@@ -0,0 +1,48 @@
+package com.jzg.config;
+
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+
+public class JzgBCryptPasswordEncoder extends BCryptPasswordEncoder {
+
+    // 盐值可以由外部传入
+    private String salt;
+
+    public JzgBCryptPasswordEncoder() {
+        super();
+    }
+
+    // 构造函数接收外部盐值
+    public JzgBCryptPasswordEncoder(String salt) {
+        this.salt = salt;
+    }
+
+    @Override
+    public String encode(CharSequence rawPassword) {
+        // 使用 MD5 对密码和盐值进行加密
+        return md5WithSalt(rawPassword.toString(), salt);
+    }
+
+    @Override
+    public boolean matches(CharSequence rawPassword, String encodedPassword) {
+        // 验证密码时,将原密码加盐后进行 MD5 加密,并与存储的加密密码进行比对
+        String encryptedPassword = md5WithSalt(rawPassword.toString(), salt);
+        return encryptedPassword.equals(encodedPassword);
+    }
+
+    private String md5WithSalt(String password, String salt) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            // 将密码和盐拼接
+            String saltedPassword = password + salt;
+            byte[] bytes = md.digest(saltedPassword.getBytes());
+            // 将加密后的字节数组转为 Base64 字符串
+            return Base64.getEncoder().encodeToString(bytes);
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("MD5 algorithm not found", e);
+        }
+    }
+}

+ 21 - 0
authentication/src/main/java/com/jzg/config/JzgGrantedAuthority.java

@@ -0,0 +1,21 @@
+package com.jzg.config;
+
+import lombok.Data;
+import org.springframework.security.core.GrantedAuthority;
+
+@Data
+public class JzgGrantedAuthority implements GrantedAuthority {
+    //所属系统
+    private String system;
+    private String roleId;
+
+    public JzgGrantedAuthority(String system,String roleId){
+        this.system = system;
+        this.roleId = roleId;
+    }
+
+    @Override
+    public String getAuthority() {
+        return this.system + ":" + this.roleId;
+    }
+}

+ 49 - 0
authentication/src/main/java/com/jzg/config/JzgTokenService.java

@@ -0,0 +1,49 @@
+package com.jzg.config;
+
+import org.redisson.api.RBucket;
+import org.redisson.api.RKeys;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.UUID;
+
+@Component
+public class JzgTokenService {
+
+    private static final String TOKEN_PREFIX = "token:";
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Value("${config.sso}")
+    private String sso;
+
+    public void saveToken(String uname,String token,String authorization){
+        if(sso.equals("1"))
+        {
+            RKeys keys = redissonClient.getKeys();
+            keys.getKeysByPattern(TOKEN_PREFIX + uname + "*").forEach(key -> {
+                redissonClient.getBucket(key).delete();
+            });
+        }
+
+        RBucket<Object> bucket = redissonClient.getBucket(token);
+        bucket.set(authorization);
+    }
+
+    public String getToken(String token){
+        RBucket<Object> bucket = redissonClient.getBucket(token);
+        Object o = bucket.get();
+        return o.toString();
+    }
+
+    //生成token
+    public String generateToken(String uname){
+        String prefix = TOKEN_PREFIX + uname + ":";
+        return prefix + UUID.randomUUID();
+    }
+
+
+}

+ 61 - 0
authentication/src/main/java/com/jzg/config/JzgUserDetails.java

@@ -0,0 +1,61 @@
+package com.jzg.config;
+
+import com.jzg.entity.SysUser;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+
+public class JzgUserDetails implements UserDetails {
+    private SysUser sysUser;
+
+    private String salt;
+
+    public JzgUserDetails(SysUser sysUser){
+        this.sysUser = sysUser;
+        this.salt = sysUser.getSalt();
+    }
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        return null;
+    }
+
+    @Override
+    public String getPassword() {
+        return sysUser.getPassword();
+    }
+
+    @Override
+    public String getUsername() {
+        return sysUser.getId();
+    }
+
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+
+    public String getSalt(){
+        return salt;
+    }
+
+    public void setSalt(String salt){
+        this.salt = salt;
+    }
+}

+ 26 - 0
authentication/src/main/java/com/jzg/config/JzgUserDetailsService.java

@@ -0,0 +1,26 @@
+package com.jzg.config;
+
+import com.jzg.entity.SysUser;
+import com.jzg.service.SysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Component;
+
+import java.util.Objects;
+
+@Component
+public class JzgUserDetailsService implements UserDetailsService {
+    @Autowired
+    SysUserService sysUserService;
+
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        SysUser sysUser = sysUserService.getById(username);
+        if(Objects.isNull(sysUser)){
+            throw new UsernameNotFoundException(username);
+        }
+        return new JzgUserDetails(sysUser);
+    }
+}

+ 79 - 0
authentication/src/main/java/com/jzg/config/SecurityConfig.java

@@ -0,0 +1,79 @@
+package com.jzg.config;
+
+import com.jzg.handler.JzgAuthenticationFailedHandler;
+import com.jzg.handler.JzgAuthenticationSuccessHandler;
+import com.jzg.service.SysUserRoleService;
+import com.jzg.service.SysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.web.SecurityFilterChain;
+
+
+@Configuration
+@EnableWebSecurity
+public class SecurityConfig {
+
+
+    @Autowired
+    SysUserService sysUserService;
+
+    @Autowired
+    JzgTokenService tokenService;
+
+    @Autowired
+    SysUserRoleService sysRoleService;
+
+    @Bean
+    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
+        return authenticationConfiguration.getAuthenticationManager();
+    }
+
+    @Bean
+    public AuthenticationProvider authenticationProvider(UserDetailsService userDetailsService) {
+        return new JzgAuthenticationProvider(userDetailsService,sysUserService,sysRoleService);
+    }
+
+    @Bean
+    public JzgAuthenticationSuccessHandler authenticationSuccessHandler() {
+        return new JzgAuthenticationSuccessHandler(tokenService);
+    }
+
+
+    @Bean
+    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+
+        http.authorizeHttpRequests(auth -> auth
+                        .requestMatchers("**").permitAll()  // 公开访问
+                        .requestMatchers("/auth/login").permitAll()
+                        .requestMatchers("/auth/getToken").permitAll()
+                        .requestMatchers("/auth/*").permitAll() // 公开访问
+                        .requestMatchers("/auth1/getUser").permitAll()  // 公开访问
+                        .requestMatchers("favicon.ico").permitAll()
+                        .anyRequest().authenticated()  // 其他接口需认证
+                )
+                .formLogin((form) -> form
+                        .loginPage("/login")
+                        .successHandler(new JzgAuthenticationSuccessHandler(tokenService))
+                        .failureHandler(new JzgAuthenticationFailedHandler())
+                        .permitAll()
+                        )
+                ;
+
+        return http.build();
+    }
+
+
+    @Bean
+    public BCryptPasswordEncoder bCryptPasswordEncoder() {
+        return new JzgBCryptPasswordEncoder();
+    }
+
+}

+ 78 - 0
authentication/src/main/java/com/jzg/controller/AuthController.java

@@ -0,0 +1,78 @@
+package com.jzg.controller;
+
+
+import com.jzg.aop.PremissionCheck;
+import com.jzg.config.JzgTokenService;
+import com.jzg.config.JzgUserDetailsService;
+import com.jzg.entity.SysUser;
+import com.jzg.handler.JzgAuthenticationSuccessHandler;
+import com.jzg.service.SysUserService;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.io.IOException;
+
+@RestController
+@RequestMapping("/auth")
+public class AuthController {
+
+    @Autowired
+    AuthenticationManager authenticationManager;
+
+    @Autowired
+    SysUserService sysUserService;
+
+    @Autowired
+    JzgUserDetailsService jzgUserDetailsService;
+
+    @Autowired
+    private JzgTokenService tokenStore;
+
+    /**
+     * 登录接口
+     * @param userName
+     * @param passWord
+     * @throws ServletException
+     * @throws IOException
+     */
+    @GetMapping("/login")
+    public void login(String userName,String passWord) throws ServletException, IOException {
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userName,passWord);
+        Authentication authenticate = authenticationManager.authenticate(authentication);
+        SecurityContextHolder.getContext().setAuthentication(authenticate);
+        JzgAuthenticationSuccessHandler successHandler = new JzgAuthenticationSuccessHandler(tokenStore);
+        successHandler.onAuthenticationSuccess(request, response, authenticate);
+    }
+
+    /**
+     * 获取token数据
+     * @param token
+     * @return
+     */
+    @PremissionCheck(value = "authGetToken")
+    @GetMapping("/getToken")
+    public String getToken(String token){
+        String token1 = tokenStore.getToken(token);
+        return token1;
+    }
+
+
+    @GetMapping(value = "getUser")
+    public String getUser() {
+        SysUser admin = sysUserService.getById("admin");
+        return admin.getId().toString();
+    }
+}

+ 13 - 0
authentication/src/main/java/com/jzg/entity/RedisToken.java

@@ -0,0 +1,13 @@
+package com.jzg.entity;
+
+import com.jzg.config.JzgGrantedAuthority;
+import lombok.Data;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+
+import java.util.List;
+
+@Data
+public class RedisToken {
+    private String username;
+    private List<JzgGrantedAuthority> roles;
+}

+ 13 - 0
authentication/src/main/java/com/jzg/entity/SysUser.java

@@ -0,0 +1,13 @@
+package com.jzg.entity;
+
+import jdk.jfr.DataAmount;
+import lombok.Data;
+
+@Data
+public class SysUser {
+    private String id;
+
+    private String password;
+
+    private String salt;
+}

+ 10 - 0
authentication/src/main/java/com/jzg/entity/SysUserRole.java

@@ -0,0 +1,10 @@
+package com.jzg.entity;
+
+import lombok.Data;
+
+@Data
+public class SysUserRole {
+    private Integer id;
+    private String userId;
+    private String roleId;
+}

+ 19 - 0
authentication/src/main/java/com/jzg/handler/JzgAuthenticationFailedHandler.java

@@ -0,0 +1,19 @@
+package com.jzg.handler;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AuthenticationFailureHandler;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+
+import java.io.IOException;
+
+public class JzgAuthenticationFailedHandler implements AuthenticationFailureHandler {
+
+    @Override
+    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
+        System.out.printf("登录失败");
+    }
+}

+ 61 - 0
authentication/src/main/java/com/jzg/handler/JzgAuthenticationSuccessHandler.java

@@ -0,0 +1,61 @@
+package com.jzg.handler;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.config.JzgGrantedAuthority;
+import com.jzg.config.JzgTokenService;
+import com.jzg.entity.RedisToken;
+import com.jzg.service.SysUserService;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class JzgAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
+
+
+    private JzgTokenService tokenService;
+
+    public JzgAuthenticationSuccessHandler(JzgTokenService tokenService) {
+        this.tokenService = tokenService;
+    }
+
+    @Override
+    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
+        // 获取用户信息
+        String username = authentication.getName();
+        RedisToken redisToken = new RedisToken();
+        Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
+        redisToken.setUsername(username);
+        List<JzgGrantedAuthority> jzgGrantedAuthorities = authorities.stream()
+                .map(authority -> (JzgGrantedAuthority) authority) // 强制转换为 SimpleGrantedAuthority
+                .collect(Collectors.toList());
+
+        redisToken.setRoles(jzgGrantedAuthorities);
+        String token = tokenService.generateToken(username);
+        // 生成 JWT Token
+        tokenService.saveToken(username,token,JSONObject.toJSONString(redisToken));
+
+        // 设置响应内容类型为 JSON
+        response.setContentType("application/json");
+        JSONObject json = new JSONObject();
+        json.put("code",200);
+        json.put("msg","login success");
+        json.put("data",token);
+        // 将 Token 返回给前端
+        response.getWriter().write(json.toJSONString());
+
+        // 确保状态码为 200 OK,不进行重定向
+        response.setStatus(HttpServletResponse.SC_OK);
+    }
+}

+ 9 - 0
authentication/src/main/java/com/jzg/mapper/SysUserMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.entity.SysUser;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysUserMapper extends BaseMapper<SysUser> {
+}

+ 9 - 0
authentication/src/main/java/com/jzg/mapper/SysUserRoleMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.entity.SysUserRole;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {
+}

+ 12 - 0
authentication/src/main/java/com/jzg/service/SysUserRoleService.java

@@ -0,0 +1,12 @@
+package com.jzg.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.entity.SysUserRole;
+
+import java.util.List;
+
+
+public interface SysUserRoleService extends IService<SysUserRole> {
+
+    public List<SysUserRole> getUserRole(String userId);
+}

+ 9 - 0
authentication/src/main/java/com/jzg/service/SysUserService.java

@@ -0,0 +1,9 @@
+package com.jzg.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.entity.SysUser;
+import org.springframework.stereotype.Service;
+
+
+public interface SysUserService extends IService<SysUser> {
+}

+ 20 - 0
authentication/src/main/java/com/jzg/service/impl/SysUserRoleServiceImpl.java

@@ -0,0 +1,20 @@
+package com.jzg.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.entity.SysUserRole;
+import com.jzg.mapper.SysUserRoleMapper;
+import com.jzg.service.SysUserRoleService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements SysUserRoleService {
+    @Override
+    public List<SysUserRole> getUserRole(String userId) {
+        List<SysUserRole> sysRoles = baseMapper.selectList(new LambdaQueryWrapper<SysUserRole>()
+                .eq(SysUserRole::getUserId, userId));
+        return sysRoles;
+    }
+}

+ 11 - 0
authentication/src/main/java/com/jzg/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,11 @@
+package com.jzg.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.entity.SysUser;
+import com.jzg.mapper.SysUserMapper;
+import com.jzg.service.SysUserService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
+}

+ 118 - 0
authentication/src/main/java/com/jzg/util/PasswordEncoder.java

@@ -0,0 +1,118 @@
+package com.jzg.util;
+
+import java.security.MessageDigest;
+
+/**
+ * 密码加密
+ *
+ * @author Yasepix
+ * @date Nov 20, 2018
+ */
+public class PasswordEncoder {
+
+    private final static String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
+            "e", "f"};
+
+    private final static String MD5 = "MD5";
+    private final static String SHA = "SHA";
+
+    private Object salt;
+    private String algorithm;
+
+    public PasswordEncoder(Object salt) {
+        this(salt, MD5);
+    }
+
+    public PasswordEncoder(Object salt, String algorithm) {
+        this.salt = salt;
+        this.algorithm = algorithm;
+    }
+
+    /**
+     * 密码加密
+     *
+     * @param rawPass
+     * @return
+     */
+    public String encode(String rawPass) {
+        String result = null;
+        try {
+            MessageDigest md = MessageDigest.getInstance(algorithm);
+            // 加密后的字符串
+            result = byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass).getBytes("utf-8")));
+        } catch (Exception ex) {
+        }
+        return result;
+    }
+
+    /**
+     * 密码匹配验证
+     *
+     * @param encPass 密文
+     * @param rawPass 明文
+     * @return
+     */
+    public boolean matches(String encPass, String rawPass) {
+        String pass1 = "" + encPass;
+        String pass2 = encode(rawPass);
+
+        return pass1.equals(pass2);
+    }
+
+    private String mergePasswordAndSalt(String password) {
+        if (password == null) {
+            password = "";
+        }
+
+        if ((salt == null) || "".equals(salt)) {
+            return password;
+        } else {
+            return password + "{" + salt.toString() + "}";
+        }
+    }
+
+    /**
+     * 转换字节数组为16进制字串
+     *
+     * @param b 字节数组
+     * @return 16进制字串
+     */
+    private String byteArrayToHexString(byte[] b) {
+        StringBuffer resultSb = new StringBuffer();
+        for (int i = 0; i < b.length; i++) {
+            resultSb.append(byteToHexString(b[i]));
+        }
+        return resultSb.toString();
+    }
+
+    /**
+     * 将字节转换为16进制
+     *
+     * @param b
+     * @return
+     */
+    private static String byteToHexString(byte b) {
+        int n = b;
+        if (n < 0)
+            n = 256 + n;
+        int d1 = n / 16;
+        int d2 = n % 16;
+        return hexDigits[d1] + hexDigits[d2];
+    }
+
+//	public static void main(String[] args) {
+//		String salt = "helloworld";
+//		PasswordEncoder encoderMd5 = new PasswordEncoder(salt, "MD5");
+//		String encode = encoderMd5.encode("test");
+//		System.out.println(encode);
+//		boolean passwordValid = encoderMd5.validPassword("1bd98ed329aebc7b2f89424b5a38926e", "test");
+//		System.out.println(passwordValid);
+//
+//		PasswordEncoder encoderSha = new PasswordEncoder(salt, "SHA");
+//		String pass2 = encoderSha.encode("test");
+//		System.out.println(pass2);
+//		boolean passwordValid2 = encoderSha.validPassword("1bd98ed329aebc7b2f89424b5a38926e", "test");
+//		System.out.println(passwordValid2);
+//	}
+
+}

+ 44 - 0
authentication/src/main/java/com/jzg/util/PasswordUtils.java

@@ -0,0 +1,44 @@
+package com.jzg.util;
+
+import java.util.UUID;
+
+/**
+ * 密码工具类
+ *
+ * @author Yasepix
+ * @date Sep 1, 2018
+ */
+public class PasswordUtils {
+
+    /**
+     * 匹配密码
+     *
+     * @param salt    盐
+     * @param rawPass 明文
+     * @param encPass 密文
+     * @return
+     */
+    public static boolean matches(String salt, String rawPass, String encPass) {
+        return new PasswordEncoder(salt).matches(encPass, rawPass);
+    }
+
+    /**
+     * 明文密码加密
+     *
+     * @param rawPass 明文
+     * @param salt
+     * @return
+     */
+    public static String encode(String rawPass, String salt) {
+        return new PasswordEncoder(salt).encode(rawPass);
+    }
+
+    /**
+     * 获取加密盐
+     *
+     * @return
+     */
+    public static String getSalt() {
+        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 20);
+    }
+}

+ 21 - 0
authentication/src/main/resources/application.yml

@@ -0,0 +1,21 @@
+server:
+  port: 8081
+spring:
+  redis:
+    redisson:
+      address: redis://192.168.0.250:6379
+      password: 123456
+      database: 0
+
+  datasource:
+      url: jdbc:mysql://39.98.239.48:3366/agent?serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true
+      username: root
+      password: '@RqGHG#KZ*C9ytkQ'
+      driverClassName: com.mysql.cj.jdbc.Driver
+
+mybatis-plus:
+  mapper-locations: classpath*:/mapper/*Mapper.xml
+
+
+config:
+  sso: 1

+ 20 - 0
commons/pom.xml

@@ -0,0 +1,20 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.jzg</groupId>
+        <artifactId>jzg</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>commons</artifactId>
+    <packaging>jar</packaging>
+    <name>commons Maven Webapp</name>
+    <url>http://maven.apache.org</url>
+    <dependencies>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 12 - 0
commons/src/main/java/com/jzg/aop/PremissionCheck.java

@@ -0,0 +1,12 @@
+package com.jzg.aop;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PremissionCheck {
+    String value();
+}

+ 92 - 0
commons/src/main/java/com/jzg/aop/aspect/PermissionAspect.java

@@ -0,0 +1,92 @@
+package com.jzg.aop.aspect;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.aop.PremissionCheck;
+import com.jzg.constants.RedisKeyConstants;
+import com.jzg.entity.vo.RoleMenuVo;
+import com.jzg.exception.SystemException;
+import jakarta.servlet.http.HttpServletRequest;
+import org.apache.tomcat.util.http.fileupload.RequestContext;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.cache.CacheProperties;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Aspect
+@Component
+public class PermissionAspect {
+
+    @Autowired
+    RedissonClient redissonClient;
+
+    // 定义一个切点,拦截所有带有 @PermissionCheck 注解的方法
+    @Pointcut("@annotation(permissionCheck)")
+    public void permissionCheckMethod(PremissionCheck permissionCheck) {}
+
+    // 在方法调用之前执行权限检查
+    @Before("permissionCheckMethod(permissionCheck)")
+    public void checkPermission(PremissionCheck permissionCheck) throws Exception {
+
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if(Objects.isNull(attributes)){
+            return;
+        }
+        HttpServletRequest request = attributes.getRequest();
+        //获取权限标识
+        String permission = permissionCheck.value();
+
+        // 获取当前用户的身份信息
+        String token = request.getHeader("Authorization");
+        String system = request.getHeader("System");
+
+        if(Objects.isNull(token)){
+            throw new Exception("无权限访问");
+        }
+        String userTokenDataStr = redissonClient.getBucket(token).get().toString();
+        if(Objects.isNull(userTokenDataStr))
+        {
+            throw new Exception("用户未登录");
+        }
+        JSONArray userSystemRole = JSON.parseObject(userTokenDataStr).getJSONArray("roles");
+        List<String> userSystemRoleIds = userSystemRole.stream().map(role ->
+            ((JSONObject) role).getString("roleId")).collect(Collectors.toList());
+
+        //取出缓存中的所有权限信息做对比
+        JSONArray jsonObject = JSON.parseArray(redissonClient.getBucket(RedisKeyConstants.ROLE_MENU_KEY).get().toString());
+
+        //取出系统的
+        JSONObject o = (JSONObject) jsonObject.stream()
+                .filter(item -> ((JSONObject) item).getString("systemCode").equals(system)).findFirst().orElse(null);
+
+        JSONArray collect = new JSONArray(o.getJSONArray("roleVos").stream()
+                .filter(x -> userSystemRoleIds.contains(((JSONObject) x).getString("id")))
+                .collect(Collectors.toList()));
+
+        //提取所有perms字段
+        List<String> permsList = collect.stream()
+                .flatMap(role -> {
+                    JSONArray menuVos = ((JSONObject) role).getJSONArray("menuVos");
+                    return menuVos.stream()
+                            .map(menu -> ((JSONObject) menu).getString("perms"));
+                })
+                .collect(Collectors.toList());
+
+        //判断是否用户是否存在权限标识
+        if(!permsList.contains(permission)){
+            throw new SystemException("无权限访问");
+        }
+    }
+}

+ 31 - 0
commons/src/main/java/com/jzg/config/RedissonConfig.java

@@ -0,0 +1,31 @@
+package com.jzg.config;
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.codec.JsonJacksonCodec;
+import org.redisson.config.Config;
+import org.redisson.config.SingleServerConfig;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+public class RedissonConfig {
+
+    @Bean
+    public RedissonClient redissonClient() {
+        // 配置集群模式
+        Config config = new Config();
+        List<String> redisAddress = new ArrayList<>();
+//        redisAddress.add("redis://192.168.0.250:6379");
+        SingleServerConfig clusterConfig = config.useSingleServer()
+                .setAddress("redis://192.168.0.250:6379")
+                .setPassword("123456")
+                .setTimeout(3000);
+                  // 从连接池大小
+        RedissonClient redissonClient = Redisson.create(config);
+        return redissonClient;
+    }
+}

+ 8 - 0
commons/src/main/java/com/jzg/constants/RedisKeyConstants.java

@@ -0,0 +1,8 @@
+package com.jzg.constants;
+
+public class RedisKeyConstants {
+
+    //用户角色菜单Key
+    public static final String ROLE_MENU_KEY = "ROLE:";
+
+}

+ 103 - 0
commons/src/main/java/com/jzg/core/page/HttpResult.java

@@ -0,0 +1,103 @@
+package com.jzg.core.page;
+
+
+
+import java.io.Serializable;
+
+/**
+ * HTTP结果封装
+ */
+
+public class HttpResult<T> implements Serializable {
+
+    private int code = 200;
+
+    private String msg;
+
+    private T data;
+
+    public static <T> HttpResult<T> error() {
+        return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
+    }
+
+    public static <T> HttpResult<T> error(String msg) {
+        return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
+    }
+
+    public static <T> HttpResult<T> error(int code, String msg) {
+        HttpResult<T> r = new HttpResult<>();
+        r.setCode(code);
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static <T> HttpResult<T> error(int code, T data, String msg) {
+        HttpResult<T> r = new HttpResult<>();
+        r.setCode(code);
+        r.setData(data);
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static <T> HttpResult<T> error(T data) {
+        HttpResult<T> r = new HttpResult<>();
+        r.setCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        r.setData(data);
+        return r;
+    }
+
+
+    public static <T> HttpResult<T> ok(String msg) {
+        HttpResult<T> r = new HttpResult<>();
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static <T> HttpResult<T> ok(T data) {
+        HttpResult<T> r = new HttpResult<>();
+        r.setData(data);
+        return r;
+    }
+
+    public static <T> HttpResult<T> ok(String msg, T data) {
+        HttpResult<T> r = new HttpResult<>();
+        r.msg = msg;
+        r.setData(data);
+        return r;
+    }
+
+
+    public static <T> HttpResult<T> ok() {
+        return new HttpResult<>();
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    @Override
+    public String toString() {
+        return "HttpResult{" + "code=" + code + ", msg='" + msg + '\'' + ", data=" + data + '}';
+    }
+
+}

+ 237 - 0
commons/src/main/java/com/jzg/core/page/HttpStatus.java

@@ -0,0 +1,237 @@
+package com.jzg.core.page;
+
+/**
+ * Constants enumerating the HTTP status codes.
+ * All status codes defined in RFC1945 (HTTP/1.0), RFC2616 (HTTP/1.1), and
+ * RFC2518 (WebDAV) are listed.
+ *
+ * @since 4.0
+ */
+public interface HttpStatus {
+
+    // --- 1xx Informational ---
+
+    /**
+     * {@code 100 Continue} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_CONTINUE = 100;
+    /**
+     * {@code 101 Switching Protocols} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_SWITCHING_PROTOCOLS = 101;
+    /**
+     * {@code 102 Processing} (WebDAV - RFC 2518)
+     */
+    public static final int SC_PROCESSING = 102;
+
+    // --- 2xx Success ---
+
+    /**
+     * {@code 200 OK} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_OK = 200;
+    /**
+     * {@code 201 Created} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_CREATED = 201;
+    /**
+     * {@code 202 Accepted} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_ACCEPTED = 202;
+    /**
+     * {@code 203 Non Authoritative Information} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
+    /**
+     * {@code 204 No Content} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_NO_CONTENT = 204;
+    /**
+     * {@code 205 Reset Content} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_RESET_CONTENT = 205;
+    /**
+     * {@code 206 Partial Content} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_PARTIAL_CONTENT = 206;
+    /**
+     * {@code 207 Multi-Status} (WebDAV - RFC 2518)
+     * or
+     * {@code 207 Partial Update OK} (HTTP/1.1 - draft-ietf-http-v11-spec-rev-01?)
+     */
+    public static final int SC_MULTI_STATUS = 207;
+
+    // --- 3xx Redirection ---
+
+    /**
+     * {@code 300 Mutliple Choices} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_MULTIPLE_CHOICES = 300;
+    /**
+     * {@code 301 Moved Permanently} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_MOVED_PERMANENTLY = 301;
+    /**
+     * {@code 302 Moved Temporarily} (Sometimes {@code Found}) (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_MOVED_TEMPORARILY = 302;
+    /**
+     * {@code 303 See Other} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_SEE_OTHER = 303;
+    /**
+     * {@code 304 Not Modified} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_NOT_MODIFIED = 304;
+    /**
+     * {@code 305 Use Proxy} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_USE_PROXY = 305;
+    /**
+     * {@code 307 Temporary Redirect} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_TEMPORARY_REDIRECT = 307;
+
+    // --- 4xx Client Error ---
+
+    /**
+     * {@code 400 Bad Request} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_BAD_REQUEST = 400;
+    /**
+     * {@code 401 Unauthorized} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_UNAUTHORIZED = 401;
+    /**
+     * {@code 402 Payment Required} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_PAYMENT_REQUIRED = 402;
+    /**
+     * {@code 403 Forbidden} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_FORBIDDEN = 403;
+    /**
+     * {@code 404 Not Found} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_NOT_FOUND = 404;
+    /**
+     * {@code 405 Method Not Allowed} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_METHOD_NOT_ALLOWED = 405;
+    /**
+     * {@code 406 Not Acceptable} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_NOT_ACCEPTABLE = 406;
+    /**
+     * {@code 407 Proxy Authentication Required} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
+    /**
+     * {@code 408 Request Timeout} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_REQUEST_TIMEOUT = 408;
+    /**
+     * {@code 409 Conflict} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_CONFLICT = 409;
+    /**
+     * {@code 410 Gone} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_GONE = 410;
+    /**
+     * {@code 411 Length Required} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_LENGTH_REQUIRED = 411;
+    /**
+     * {@code 412 Precondition Failed} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_PRECONDITION_FAILED = 412;
+    /**
+     * {@code 413 Request Entity Too Large} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_REQUEST_TOO_LONG = 413;
+    /**
+     * {@code 414 Request-URI Too Long} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_REQUEST_URI_TOO_LONG = 414;
+    /**
+     * {@code 415 Unsupported Media Type} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
+    /**
+     * {@code 416 Requested Range Not Satisfiable} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
+    /**
+     * {@code 417 Expectation Failed} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_EXPECTATION_FAILED = 417;
+
+    /**
+     * Static constant for a 418 error.
+     * {@code 418 Unprocessable Entity} (WebDAV drafts?)
+     * or {@code 418 Reauthentication Required} (HTTP/1.1 drafts?)
+     */
+    // not used
+    // public static final int SC_UNPROCESSABLE_ENTITY = 418;
+
+    /**
+     * Static constant for a 419 error.
+     * {@code 419 Insufficient Space on Resource}
+     * (WebDAV - draft-ietf-webdav-protocol-05?)
+     * or {@code 419 Proxy Reauthentication Required}
+     * (HTTP/1.1 drafts?)
+     */
+    public static final int SC_INSUFFICIENT_SPACE_ON_RESOURCE = 419;
+    /**
+     * Static constant for a 420 error.
+     * {@code 420 Method Failure}
+     * (WebDAV - draft-ietf-webdav-protocol-05?)
+     */
+    public static final int SC_METHOD_FAILURE = 420;
+    /**
+     * {@code 422 Unprocessable Entity} (WebDAV - RFC 2518)
+     */
+    public static final int SC_UNPROCESSABLE_ENTITY = 422;
+    /**
+     * {@code 423 Locked} (WebDAV - RFC 2518)
+     */
+    public static final int SC_LOCKED = 423;
+    /**
+     * {@code 424 Failed Dependency} (WebDAV - RFC 2518)
+     */
+    public static final int SC_FAILED_DEPENDENCY = 424;
+
+    // --- 5xx Server Error ---
+
+    /**
+     * {@code 500 Server Error} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_INTERNAL_SERVER_ERROR = 500;
+    /**
+     * {@code 501 Not Implemented} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_NOT_IMPLEMENTED = 501;
+    /**
+     * {@code 502 Bad Gateway} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_BAD_GATEWAY = 502;
+    /**
+     * {@code 503 Service Unavailable} (HTTP/1.0 - RFC 1945)
+     */
+    public static final int SC_SERVICE_UNAVAILABLE = 503;
+    /**
+     * {@code 504 Gateway Timeout} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_GATEWAY_TIMEOUT = 504;
+    /**
+     * {@code 505 HTTP Version Not Supported} (HTTP/1.1 - RFC 2616)
+     */
+    public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
+
+    /**
+     * {@code 507 Insufficient Storage} (WebDAV - RFC 2518)
+     */
+    public static final int SC_INSUFFICIENT_STORAGE = 507;
+
+}

+ 45 - 0
commons/src/main/java/com/jzg/entity/vo/RoleMenuVo.java

@@ -0,0 +1,45 @@
+package com.jzg.entity.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 角色菜单Vo对象
+ */
+@Data
+public class RoleMenuVo {
+    private String id;
+
+    private String systemCode;
+
+    private String systemName;
+
+    private List<RoleVo> roleVos;
+
+    @Data
+    public static class RoleVo{
+        private String id;
+
+        private String name;
+
+        private String remark;
+
+        private List<MenuVo> menuVos;
+    }
+
+    @Data
+    public static class MenuVo{
+
+        private String id;
+
+        private String name;
+
+        private String parentId;
+
+        private String url;
+
+        private String perms;
+    }
+
+}

+ 58 - 0
commons/src/main/java/com/jzg/exception/GlobalExceptionHandler.java

@@ -0,0 +1,58 @@
+package com.jzg.exception;
+
+import com.jzg.core.page.HttpResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.sql.SQLIntegrityConstraintViolationException;
+import java.util.List;
+
+@ControllerAdvice
+public class GlobalExceptionHandler {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+    /**
+     * 判断错误是否是已定义的已知错误,不是则由未知错误代替,同时记录在log中
+     *
+     * @param e 异常
+     * @return
+     */
+    @ExceptionHandler(value = Exception.class)
+    @ResponseBody
+    public HttpResult exceptionGet(Exception e) {
+        LOGGER.error("【系统异常】{}", e);
+        return HttpResult.error(-9999, "程序异常,请联系管理员");
+    }
+
+
+    @ExceptionHandler(value = SystemException.class)
+    @ResponseBody
+    public HttpResult systemExceptionHandle(SystemException systemException) {
+        return HttpResult.error(Integer.parseInt(systemException.getCode()), systemException.getMessage());
+    }
+
+    @ExceptionHandler(value = MethodArgumentNotValidException.class)
+    @ResponseBody
+    public HttpResult methodArgumentNotValidExceptionHandle(MethodArgumentNotValidException methodArgumentNotValidException) {
+        BindingResult bindingResult = methodArgumentNotValidException.getBindingResult();
+        List<ObjectError> objectErrors = bindingResult.getAllErrors();
+        String message = objectErrors.get(0).getDefaultMessage();
+        return HttpResult.error(400, message);
+    }
+
+
+    @ExceptionHandler(value = DuplicateKeyException.class)
+    @ResponseBody
+    public HttpResult sqlExceptionHandle(SQLIntegrityConstraintViolationException sqlException) {
+        return HttpResult.error("违反唯一约束:" + sqlException.getMessage().substring(0, sqlException.getMessage().indexOf("for key")));
+    }
+}
+

+ 28 - 0
commons/src/main/java/com/jzg/exception/SystemException.java

@@ -0,0 +1,28 @@
+package com.jzg.exception;
+
+
+public class SystemException extends RuntimeException {
+
+    private final String code;
+
+    public SystemException(String message) {
+        super(message);
+        this.code = "500";
+    }
+
+    public SystemException(String code, String message) {
+        super(message);
+        this.code = code;
+    }
+
+    public SystemException(String code, String message, Throwable cause) {
+        super(message, cause);
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+}
+

+ 40 - 0
gateway/pom.xml

@@ -0,0 +1,40 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.jzg</groupId>
+        <artifactId>jzg</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>gateway</artifactId>
+    <packaging>war</packaging>
+    <name>gateway Maven Webapp</name>
+    <url>http://maven.apache.org</url>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-gateway</artifactId>
+            <version>3.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>commons</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-gateway-server</artifactId>
+            <version>4.0.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>user</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <finalName>gateway</finalName>
+    </build>
+</project>

+ 13 - 0
gateway/src/main/java/com/jzg/GateWayApplication.java

@@ -0,0 +1,13 @@
+package com.jzg;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GateWayApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(GateWayApplication.class, args);
+    }
+
+}

+ 17 - 0
gateway/src/main/java/com/jzg/config/AopConfig.java

@@ -0,0 +1,17 @@
+package com.jzg.config;
+
+import com.jzg.aop.aspect.PermissionAspect;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AopConfig {
+
+    //禁止 permission 切面
+    @Bean
+    @ConditionalOnProperty(name = "aop.permission.enabled", havingValue = "true")
+    public PermissionAspect permissionAspect() {
+        return new PermissionAspect();
+    }
+}

+ 14 - 0
gateway/src/main/java/com/jzg/config/GatewayConfig.java

@@ -0,0 +1,14 @@
+package com.jzg.config;
+
+import com.jzg.filter.AuthFilter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class GatewayConfig {
+
+    @Bean
+    public AuthFilter authFilter() {
+        return new AuthFilter();
+    }
+}

+ 33 - 0
gateway/src/main/java/com/jzg/filter/AuthFilter.java

@@ -0,0 +1,33 @@
+package com.jzg.filter;
+
+import com.jzg.aop.PremissionCheck;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.context.ApplicationContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.gateway.filter.GatewayFilter;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+@Component
+@Order(0)
+public class AuthFilter implements GlobalFilter {
+
+    @Autowired
+    private ApplicationContext applicationContext;
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        // 获取请求路径和方法
+        String path = exchange.getRequest().getPath().value();
+
+        // 如果权限验证通过,继续请求链
+        return chain.filter(exchange);
+    }
+
+}

+ 18 - 0
gateway/src/main/resources/application.yml

@@ -0,0 +1,18 @@
+server:
+  port: 8001
+spring:
+  main:
+    web-application-type: reactive
+    allow-bean-definition-overriding: true
+  cloud:
+    gateway:
+      routes:
+        - id: auth_route
+          uri: http://localhost:8081/
+          predicates:
+            - Path=/auth/**
+
+        - id: platform_route
+          uri: http://localhost:8083/
+          predicates:
+            - Path=/**

+ 48 - 0
platform/pom.xml

@@ -0,0 +1,48 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.jzg</groupId>
+        <artifactId>jzg</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>platform</artifactId>
+    <packaging>war</packaging>
+    <name>platform Maven Webapp</name>
+    <url>http://maven.apache.org</url>
+    <dependencies>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-extension</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>commons</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+    </dependencies>
+    <build>
+        <finalName>platform</finalName>
+    </build>
+</project>

+ 15 - 0
platform/src/main/java/com/jzg/PlatFormApplication.java

@@ -0,0 +1,15 @@
+package com.jzg;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+
+@SpringBootApplication
+public class PlatFormApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(PlatFormApplication.class, args);
+    }
+
+}

+ 30 - 0
platform/src/main/java/com/jzg/controller/UserRoleController.java

@@ -0,0 +1,30 @@
+package com.jzg.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.aop.PremissionCheck;
+import com.jzg.entity.vo.RoleMenuVo;
+import com.jzg.service.UserRoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/userRole")
+public class UserRoleController {
+
+    @Autowired
+    UserRoleService userRoleService;
+
+    @PremissionCheck(value = "sys:pro")
+    @GetMapping("/getAllMenu")
+    public String getAllMenu(){
+        List<RoleMenuVo> allRoleMenu = userRoleService.getAllRoleMenu();
+
+        return JSONObject.toJSONString(allRoleMenu);
+    }
+
+}

+ 17 - 0
platform/src/main/java/com/jzg/entity/po/SysMenu.java

@@ -0,0 +1,17 @@
+package com.jzg.entity.po;
+
+import lombok.Data;
+
+@Data
+public class SysMenu {
+
+    private String id;
+
+    private String name;
+
+    private String parentId;
+
+    private String url;
+
+    private String perms;
+}

+ 15 - 0
platform/src/main/java/com/jzg/entity/po/SysRole.java

@@ -0,0 +1,15 @@
+package com.jzg.entity.po;
+
+import lombok.Data;
+
+@Data
+public class SysRole {
+
+    private String id;
+
+    private String system;
+
+    private String name;
+
+    private String remark;
+}

+ 13 - 0
platform/src/main/java/com/jzg/entity/po/SysRoleMenu.java

@@ -0,0 +1,13 @@
+package com.jzg.entity.po;
+
+import lombok.Data;
+
+@Data
+public class SysRoleMenu {
+
+    private String id;
+
+    private String roleId;
+
+    private String menuId;
+}

+ 14 - 0
platform/src/main/java/com/jzg/entity/po/SysUserRole.java

@@ -0,0 +1,14 @@
+package com.jzg.entity.po;
+
+import lombok.Data;
+
+@Data
+public class SysUserRole {
+
+    private String id;
+
+    private String userId;
+
+    private String roleId;
+
+}

+ 34 - 0
platform/src/main/java/com/jzg/event/PlatFormApplicationLister.java

@@ -0,0 +1,34 @@
+package com.jzg.event;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.constants.RedisKeyConstants;
+import com.jzg.entity.vo.RoleMenuVo;
+import com.jzg.service.UserRoleService;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * springboot 初始化完成事件处理
+ */
+@Component
+public class PlatFormApplicationLister implements ApplicationListener<ApplicationReadyEvent> {
+
+    @Autowired
+    private UserRoleService userRoleService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Override
+    public void onApplicationEvent(ApplicationReadyEvent event) {
+        //将所有用户角色权限放到redis里
+        List<RoleMenuVo> allRoleMenu = userRoleService.getAllRoleMenu();
+        redissonClient.getBucket(RedisKeyConstants.ROLE_MENU_KEY).set(JSONObject.toJSONString(allRoleMenu));
+    }
+}

+ 9 - 0
platform/src/main/java/com/jzg/mapper/SysMenuMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.entity.po.SysMenu;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysMenuMapper extends BaseMapper<SysMenu> {
+}

+ 15 - 0
platform/src/main/java/com/jzg/mapper/SysRoleMapper.java

@@ -0,0 +1,15 @@
+package com.jzg.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.entity.po.SysRole;
+import com.jzg.entity.vo.RoleMenuVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface SysRoleMapper extends BaseMapper<SysRole> {
+
+    public List<RoleMenuVo> getAllRoleMenu();
+
+}

+ 9 - 0
platform/src/main/java/com/jzg/mapper/SysRoleMenuMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.entity.po.SysRoleMenu;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> {
+}

+ 9 - 0
platform/src/main/java/com/jzg/mapper/SysUserRoleMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.entity.po.SysUserRole;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {
+}

+ 18 - 0
platform/src/main/java/com/jzg/service/UserRoleService.java

@@ -0,0 +1,18 @@
+package com.jzg.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.entity.po.SysRole;
+import com.jzg.entity.vo.RoleMenuVo;
+
+import java.util.List;
+
+public interface UserRoleService extends IService<SysRole> {
+
+    /**
+     * 获取所有角色菜单
+     * @return
+     */
+    public List<RoleMenuVo> getAllRoleMenu();
+
+
+}

+ 19 - 0
platform/src/main/java/com/jzg/service/impl/UserRoleServiceImpl.java

@@ -0,0 +1,19 @@
+package com.jzg.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.entity.po.SysRole;
+import com.jzg.entity.vo.RoleMenuVo;
+import com.jzg.mapper.SysRoleMapper;
+import com.jzg.service.UserRoleService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class UserRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements UserRoleService {
+    @Override
+    public List<RoleMenuVo> getAllRoleMenu() {
+        List<RoleMenuVo> allRoleMenu = baseMapper.getAllRoleMenu();
+        return allRoleMenu;
+    }
+}

+ 21 - 0
platform/src/main/resources/application.yml

@@ -0,0 +1,21 @@
+server:
+  port: 8083
+spring:
+  redis:
+    redisson:
+      address: redis://192.168.0.250:6379
+      password: 123456
+      database: 0
+
+  datasource:
+      url: jdbc:mysql://39.98.239.48:3366/platform?serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true
+      username: root
+      password: '@RqGHG#KZ*C9ytkQ'
+      driverClassName: com.mysql.cj.jdbc.Driver
+
+mybatis-plus:
+  mapper-locations: classpath*:/mapper/*Mapper.xml
+
+
+config:
+  sso: 1

+ 40 - 0
platform/src/main/resources/mapper/SysRoleMapper.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.mapper.SysRoleMapper">
+    <resultMap id="RoleMenuMap" type="com.jzg.entity.vo.RoleMenuVo">
+        <result column="id" property="id"/>
+        <result column="systemCode" property="systemCode"/>
+        <result column="systemName" property="systemName"/>
+
+        <collection property="roleVos" ofType="com.jzg.entity.vo.RoleMenuVo$RoleVo">
+            <result column="roleId" property="id"/>
+            <result column="roleName" property="name"/>
+            <result column="remark" property="remark"/>
+
+            <collection property="menuVos" ofType="com.jzg.entity.vo.RoleMenuVo$MenuVo">
+                <result column="menuId" property="id"/>
+                <result column="perms" property="perms"/>
+                <result column="menuName" property="name"/>
+            </collection>
+        </collection>
+
+    </resultMap>
+
+    <select id="getAllRoleMenu" resultMap="RoleMenuMap">
+        SELECT
+            ss.id,
+            ss.sys_code as systemCode,
+            ss.sys_name as systemName,
+            sr.id as roleId,
+            sr.name as roleName,
+            sr.remark,
+            sm.id as menuId,
+            sm.`name` as menuName,
+            sm.perms
+        FROM
+            sys_system ss
+                LEFT JOIN sys_role sr ON sr.system = ss.id
+                LEFT JOIN sys_role_menu srm ON sr.id = srm.role_id
+                LEFT JOIN sys_menu sm ON srm.menu_id = sm.id
+    </select>
+</mapper>

+ 142 - 0
pom.xml

@@ -0,0 +1,142 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.jzg</groupId>
+  <artifactId>jzg</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <name>jzg Maven Webapp</name>
+  <modules>
+    <module>authentication</module>
+    <module>commons</module>
+    <module>gateway</module>
+      <module>platform</module>
+  </modules>
+  <packaging>pom</packaging>
+
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>3.0.0</version>
+    <relativePath/> <!-- lookup parent from repository -->
+  </parent>
+
+  <properties>
+    <fastjson.version>1.2.58</fastjson.version>
+    <redisson.version>3.23.3</redisson.version>
+    <mysql.connect.version>8.0.26</mysql.connect.version>
+    <mybatis.plus.version>3.5.7</mybatis.plus.version>
+  </properties>
+
+
+  <dependencies>
+    <!-- Spring Boot Starter Web -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <!-- Spring Boot Starter Test -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-aop</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.redisson</groupId>
+      <artifactId>redisson</artifactId>
+      <version>${redisson.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.redisson</groupId>
+      <artifactId>redisson-spring-boot-starter</artifactId>
+      <version>${redisson.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.redisson</groupId>
+      <artifactId>redisson-spring-data-27</artifactId>
+      <version>${redisson.version}</version>
+    </dependency>
+
+    <!-- fastjson -->
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>${fastjson.version}</version>
+    </dependency>
+  </dependencies>
+  <dependencyManagement>
+    <dependencies>
+
+      <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-security</artifactId>
+        <version>3.0.0</version>
+      </dependency>
+
+      <!-- 数据库驱动,如 MySQL -->
+      <dependency>
+        <groupId>mysql</groupId>
+        <artifactId>mysql-connector-java</artifactId>
+        <scope>runtime</scope>
+        <version>${mysql.connect.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>com.baomidou</groupId>
+        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+        <version>${mybatis.plus.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>com.baomidou</groupId>
+        <artifactId>mybatis-plus</artifactId>
+        <version>${mybatis.plus.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>com.baomidou</groupId>
+        <artifactId>mybatis-plus-extension</artifactId>
+        <version>${mybatis.plus.version}</version>
+      </dependency>
+
+    </dependencies>
+  </dependencyManagement>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>3.2.4</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <transformers>
+<!--                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">-->
+<!--                  <mainClass>com.example.MainClass</mainClass>-->
+<!--                </transformer>-->
+                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                  <resource>META-INF/spring.handlers</resource>
+                </transformer>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                  <resource>META-INF/spring.schemas</resource>
+                </transformer>
+              </transformers>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>