构建一个完整的基于Spring Boot的权限管理系统是一个庞大的任务,涉及多个模块和复杂的业务逻辑。由于代码量较大,我将提供一个简化版本的框架结构,并详细解释每个部分的关键实现。你可以根据需要进一步扩展和完善这个系统。
项目结构
src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── controller
│ │ │ ├── UserController.java
│ │ │ ├── RoleController.java
│ │ │ ├── OrganizationController.java
│ │ │ ├── MenuController.java
│ │ │ ├── AuthController.java
│ │ │ └── PermissionController.java
│ │ ├── service
│ │ │ ├── UserService.java
│ │ │ ├── RoleService.java
│ │ │ ├── OrganizationService.java
│ │ │ ├── MenuService.java
│ │ │ ├── PermissionService.java
│ │ │ ├── AuthService.java
│ │ │ └── impl
│ │ │ ├── UserServiceImpl.java
│ │ │ ├── RoleServiceImpl.java
│ │ │ ├── OrganizationServiceImpl.java
│ │ │ ├── MenuServiceImpl.java
│ │ │ ├── PermissionServiceImpl.java
│ │ │ └── AuthServiceImpl.java
│ │ ├── mapper
│ │ │ ├── UserMapper.java
│ │ │ ├── RoleMapper.java
│ │ │ ├── OrganizationMapper.java
│ │ │ ├── MenuMapper.java
│ │ │ ├── PermissionMapper.java
│ │ │ └── AuthMapper.java
│ │ ├── config
│ │ │ ├── JwtConfig.java
│ │ │ └── SecurityConfig.java
│ │ └── DemoApplication.java
│ └── resources
│ ├── application.properties
│ ├── mapper
│ │ ├── UserMapper.xml
│ │ ├── RoleMapper.xml
│ │ ├── OrganizationMapper.xml
│ │ ├── MenuMapper.xml
│ │ ├── PermissionMapper.xml
│ │ └── AuthMapper.xml
│ └── static
└── test
└── java
└── com
└── example
└── demo
└── DemoApplicationTests.java
核心依赖 (pom.xml)
确保你的pom.xml
文件中包含以下核心依赖:
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- JWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Lombok for less boilerplate code -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
配置文件 (application.properties)
# MySQL Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# MyBatis Configuration
mybatis.mapper-locations=classpath:mapper/*.xml
# JWT Configuration
jwt.secret=yourSecretKey
jwt.expiration=86400 # seconds
JWT配置 (JwtConfig.java)
package com.example.demo.config;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class JwtConfig {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private long expiration;
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
public Claims getClaimsFromToken(String token) {
return Jw