# spring-security-demo **Repository Path**: sanbingdai/spring-security-demo ## Basic Information - **Project Name**: spring-security-demo - **Description**: spring-security学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-12 - **Last Updated**: 2026-03-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot + JWT 认证系统 这是一个基于Spring Boot和JWT的前后端分离登录认证系统。 ## 技术栈 - **Spring Boot 2.6.13** - Web框架 - **Spring Security** - 安全框架 - **Spring Data JPA** - 数据持久化 - **MySQL** - 数据库 - **JWT (jjwt 0.11.5)** - Token认证 - **Lombok** - 简化代码 - **Maven** - 项目构建 ## 项目特性 ### 后端特性 - ✅ JWT Token无状态认证 - ✅ BCrypt密码加密 - ✅ 基于角色的权限控制(RBAC) - ✅ 跨域支持(CORS) - ✅ 全局异常处理 - ✅ 参数校验 - ✅ 详细的中文注释 - ✅ RESTful API设计 ### 前端特性 - ✅ 精美的登录页面 - ✅ 用户注册页面 - ✅ 用户信息展示首页 - ✅ 响应式设计 - ✅ 实时表单验证 - ✅ 友好的错误提示 - ✅ Token自动管理 - ✅ 优雅的加载动画 ## 快速开始 ### 1. 数据库准备 创建MySQL数据库并导入初始数据: ```bash mysql -u root -p < src/main/resources/sql/init.sql ``` 或者手动执行SQL: ```sql CREATE DATABASE security_demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE security_demo; CREATE TABLE sys_user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, email VARCHAR(50) DEFAULT NULL, phone VARCHAR(20) DEFAULT NULL, role VARCHAR(10) DEFAULT 'USER', is_enabled TINYINT(1) DEFAULT 1, created_time DATETIME DEFAULT CURRENT_TIMESTAMP, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ``` ### 2. 修改配置 编辑 `src/main/resources/application.properties`,修改数据库连接信息: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/security_demo spring.datasource.username=root spring.datasource.password=your_password ``` ### 3. 编译运行 ```bash # 编译 mvn clean package # 运行 java -jar target/spring-security-demo-0.0.1-SNAPSHOT.jar ``` 或直接使用Maven运行: ```bash mvn spring-boot:run ``` 应用启动后访问:http://localhost:8080 ### 4. 访问前端页面 系统已内置完整的前端页面,可以直接通过浏览器访问: - **登录页面**: http://localhost:8080/login.html - **注册页面**: http://localhost:8080/register.html - **首页**: http://localhost:8080/index.html (需要登录) ## 前端页面说明 ### 1. 登录页面 (login.html) - 用户名和密码登录 - 实时表单验证 - 友好的错误提示 - 自动跳转到首页 ### 2. 注册页面 (register.html) - 完整的用户注册表单 - 用户名、密码、邮箱、手机号 - 密码确认验证 - 邮箱格式校验 ### 3. 首页 (index.html) - 展示当前登录用户信息 - 测试用户权限接口 - 测试管理员权限接口(仅管理员可见) - 退出登录功能 ## API接口文档 ### 公开接口(无需认证) #### 1. 用户注册 ```http POST /api/auth/register Content-Type: application/json { "username": "testuser", "password": "123456", "email": "test@example.com", "phone": "13800138000" } ``` **响应:** ```json { "code": 200, "message": "注册成功", "data": null } ``` #### 2. 用户登录 ```http POST /api/auth/login Content-Type: application/json { "username": "admin", "password": "admin123" } ``` **响应:** ```json { "code": 200, "message": "登录成功", "data": { "token": "eyJhbGciOiJIUzUxMiJ9...", "type": "Bearer", "userId": 1, "username": "admin", "role": "ADMIN" } } ``` ### 需要认证的接口 所有需要认证的接口都需要在请求头中携带JWT Token: ```http Authorization: Bearer {token} ``` #### 3. 获取当前用户信息 ```http GET /api/user/info Authorization: Bearer eyJhbGciOiJIUzUxMiJ9... ``` **响应:** ```json { "code": 200, "message": "操作成功", "data": { "id": 1, "username": "admin", "email": "admin@example.com", "phone": null, "role": "ADMIN" } } ``` #### 4. 管理员接口(需要ADMIN角色) ```http GET /api/user/admin Authorization: Bearer {token} ``` #### 5. 普通用户接口(需要USER或ADMIN角色) ```http GET /api/user/user Authorization: Bearer {token} ``` ## 测试账号 系统内置以下测试账号: | 用户名 | 密码 | 角色 | 说明 | |--------|------|------|------| | admin | admin123 | ADMIN | 管理员 | | user | user123 | USER | 普通用户 | ## 使用curl测试API ### 1. 注册新用户 ```bash curl -X POST http://localhost:8080/api/auth/register \ -H "Content-Type: application/json" \ -d '{"username":"newuser","password":"123456","email":"new@example.com"}' ``` ### 2. 登录获取Token ```bash curl -X POST http://localhost:8080/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"admin123"}' ``` ### 3. 使用Token访问受保护接口 ```bash TOKEN="your_token_here" curl -X GET http://localhost:8080/api/user/info \ -H "Authorization: Bearer $TOKEN" ``` ## 项目结构 ``` spring-security-demo/ ├── src/main/java/com/lx/springsecuritydemo/ │ ├── config/ # 配置类 │ │ └── CorsConfig.java # CORS跨域配置 │ ├── controller/ # 控制器 │ │ ├── AuthController.java # 认证接口(注册/登录) │ │ └── UserController.java # 用户接口(需要认证) │ ├── dto/ # 数据传输对象 │ │ ├── ApiResponse.java # 通用响应封装 │ │ ├── LoginRequest.java # 登录请求DTO │ │ ├── LoginResponse.java # 登录响应DTO │ │ └── RegisterRequest.java # 注册请求DTO │ ├── entity/ # 实体类 │ │ └── User.java # 用户实体(对应数据库表) │ ├── exception/ # 异常处理 │ │ └── GlobalExceptionHandler.java # 全局异常处理器 │ ├── repository/ # 数据访问层 │ │ └── UserRepository.java # JPA用户仓库 │ ├── security/ # 安全配置 │ │ ├── CustomAuthenticationService.java # 自定义认证服务 │ │ ├── CustomUserDetailsService.java # 自定义用户详情服务 │ │ ├── JwtAuthenticationFilter.java # JWT认证过滤器 │ │ ├── JwtTokenProvider.java # JWT Token提供者 │ │ └── SecurityConfig.java # Spring Security配置 │ └── service/ # 业务层 │ └── AuthService.java # 认证业务服务 ├── src/main/resources/ │ ├── application.properties # 应用配置文件 │ ├── sql/ │ │ └── init.sql # 数据库初始化脚本 │ └── static/ # 前端静态资源 │ ├── login.html # 登录页面 │ ├── register.html # 注册页面 │ ├── index.html # 首页 │ ├── css/ │ │ └── style.css # 全局样式 │ └── js/ │ ├── api.js # API调用封装 │ ├── login.js # 登录页面逻辑 │ ├── register.js # 注册页面逻辑 │ └── home.js # 首页逻辑 ├── pom.xml # Maven配置 └── README.md # 项目文档 ``` ## 配置说明 ### JWT配置 ```properties jwt.secret=mySecretKeyForJWTTokenGeneration12345678901234567890 jwt.expiration=86400000 # 24小时(毫秒) ``` ### CORS配置 ```properties cors.allowed-origins=http://localhost:3000,http://localhost:8081 ``` ### 数据库配置 ```properties spring.datasource.url=jdbc:mysql://localhost:3306/security_demo spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true ``` ## 常见问题 ### 1. 启动时数据库连接失败 检查 `application.properties` 中的数据库配置是否正确,确保MySQL服务已启动。 ### 2. Token过期 默认Token有效期为24小时,可在 `application.properties` 中修改 `jwt.expiration` 配置。 ### 3. 跨域问题 检查 `CorsConfig.java` 中的允许源配置,确保前端地址在允许列表中。 ## 扩展功能 ### 添加新的角色 在数据库中将用户的 `role` 字段设置为新的角色名(如 "MANAGER"),然后在Controller中使用: ```java @PreAuthorize("hasRole('MANAGER')") ``` ### 自定义Token有效期 可在 `JwtTokenProvider.generateToken()` 方法中修改Token的生成逻辑。 ### 添加刷新Token 可以扩展实现Refresh Token机制,实现Token的无感刷新。 ## 许可证 MIT License