实验目标
本节主要完成以下任务:
- ✅ 搭建完整的 Java 开发环境
- ✅ 配置 MySQL 数据库并初始化数据
- ✅ 配置 Redis 缓存服务
- ✅ 运行项目并验证环境正确性
- ✅ 理解 OAuth 2.0 基本概念和系统整体设计
详细任务
一、环境搭建
1. 安装 JDK 17
步骤
- 
下载 JDK - 官方版本:Oracle JDK 17
- 开源版本:OpenJDK 17(推荐)
 
- 
安装 JDK Windows: # 双击运行 .exe 文件,按提示完成安装 # 默认安装路径:C:\Program Files\Java\jdk-17macOS: # 使用 Homebrew 安装(推荐) brew install openjdk@17 # 或下载 .dmg 文件手动安装Linux (Ubuntu/Debian): sudo apt update sudo apt install openjdk-17-jdkLinux (CentOS/RHEL): sudo yum install java-17-openjdk-devel
- 
配置环境变量 Windows: # 1. 新建系统变量 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk-17 # 2. 编辑 Path 变量,添加: %JAVA_HOME%\binmacOS/Linux: # 编辑 ~/.bashrc 或 ~/.zshrc echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> ~/.bashrc echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc source ~/.bashrc # macOS (Homebrew) 可能需要: echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> ~/.zshrc
- 
验证安装 java -version # 输出示例: # openjdk version "17.0.12" 2024-07-16 # OpenJDK Runtime Environment (build 17.0.12+7) # OpenJDK 64-Bit Server VM (build 17.0.12+7, mixed mode)
2. 安装 Maven 3.8+
步骤
- 
下载 Maven - 访问:Maven 官网下载页
- 下载 Binary zip 包(如 apache-maven-3.9.6-bin.zip)
 
- 
解压并配置 Windows: # 解压到:C:\Program Files\apache-maven-3.9.6 # 新建系统变量 MAVEN_HOME = C:\Program Files\apache-maven-3.9.6 # 编辑 Path,添加: %MAVEN_HOME%\binmacOS/Linux: # 解压 tar -xzf apache-maven-3.9.6-bin.tar.gz sudo mv apache-maven-3.9.6 /opt/maven # 配置环境变量 echo 'export MAVEN_HOME=/opt/maven' >> ~/.bashrc echo 'export PATH=$MAVEN_HOME/bin:$PATH' >> ~/.bashrc source ~/.bashrc
- 
配置 Maven 镜像(加速依赖下载) 编辑 $MAVEN_HOME/conf/settings.xml,在<mirrors>标签中添加:<mirror> <id>aliyun</id> <mirrorOf>central</mirrorOf> <name>Aliyun Maven Mirror</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
- 
验证安装 mvn -v # 输出示例: # Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae) # Maven home: /opt/maven # Java version: 17.0.12, vendor: Oracle Corporation
3. 安装 MySQL 8.0
步骤
- 
下载并安装 Windows: - 访问:MySQL Community Downloads
- 下载 MySQL Installer
- 运行安装向导,选择 “Developer Default”
- 重要:设置 root 密码并牢记(建议使用 root123456便于测试)
- 端口保持默认 3306
 macOS: brew install mysql@8.0 brew services start mysql@8.0 # 设置 root 密码 mysql_secure_installationLinux (Ubuntu/Debian): sudo apt update sudo apt install mysql-server sudo systemctl start mysql sudo systemctl enable mysql # 设置 root 密码 sudo mysql_secure_installation
- 
创建数据库 # 登录 MySQL mysql -u root -p-- 创建数据库 CREATE DATABASE smart_sso DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建用户(可选,用于应用连接) CREATE USER 'sso_user'@'localhost' IDENTIFIED BY 'sso_password'; GRANT ALL PRIVILEGES ON smart_sso.* TO 'sso_user'@'localhost'; FLUSH PRIVILEGES; EXIT;
- 
初始化数据表 在项目根目录找到 sql/init.sql文件,执行:mysql -u root -p smart_sso < sql/init.sql该脚本会创建以下表: - user- 用户表
- app- 客户端应用表
- 其他必要的配置表
 
- 
验证 USE smart_sso; SHOW TABLES; -- 应显示:user, app 等表
4. 安装 Redis
步骤
Windows:
# 方法 1:使用 WSL
wsl --install
wsl
sudo apt install redis-server
redis-server
# 方法 2:下载 Windows 版本
# 访问:https://github.com/microsoftarchive/redis/releases
# 下载 Redis-x64-*.msi 并安装
# 默认端口:6379
macOS:
brew install redis
brew services start redis
# 测试连接
redis-cli ping
# 输出:PONG
Linux:
# Ubuntu/Debian
sudo apt install redis-server
sudo systemctl start redis
sudo systemctl enable redis
# CentOS/RHEL
sudo yum install redis
sudo systemctl start redis
sudo systemctl enable redis
配置 Redis(可选):
编辑 /etc/redis/redis.conf(Linux)或 /usr/local/etc/redis.conf(macOS):
# 允许远程连接(仅开发环境)
bind 0.0.0.0
# 设置密码(推荐)
requirepass yourpassword
重启 Redis:
sudo systemctl restart redis
5. 配置 IntelliJ IDEA
步骤
- 
下载并安装 IDEA 
- 
配置 JDK File → Project Structure → SDKs → + → Add JDK 选择 JDK 17 安装目录
- 
配置 Maven Settings → Build, Execution, Deployment → Build Tools → Maven Maven home path: 选择 Maven 安装目录 User settings file: 勾选 Override,选择你的 settings.xml
- 
安装推荐插件 Settings → Plugins → Marketplace推荐安装: - ✅ Lombok(必装)
- ✅ MyBatisX(MyBatis 增强)
- ✅ Database Navigator(数据库管理)
- ✅ Redis(Redis 客户端)
- ✅ Rainbow Brackets(彩虹括号)
- ✅ GitToolBox(Git 增强)
 
- 
配置数据库连接 View → Tool Windows → Database + → Data Source → MySQL Host: localhost Port: 3306 Database: smart_sso User: root Password: 你的密码 点击 "Test Connection" 验证
- 
配置 Redis 连接(需安装 Redis 插件) Tools → Redis → Configure Host: localhost Port: 6379 Password: (如果有)
6. 获取项目代码并验证环境
步骤
- 
克隆项目 git clone https://github.com/jialog030101/OAuth2.0.git cd OAuth2.0 git checkout project1
- 
使用 IDEA 打开项目 File → Open → 选择项目目录 等待 Maven 下载依赖(首次较慢,请耐心等待)
- 
配置 application.yml 编辑 smart-sso-server/src/main/resources/application.yml:spring: datasource: url: jdbc:mysql://localhost:3306/smart_sso?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 你的MySQL密码 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 password: # 如果有密码则填写
- 
运行项目 找到主类 SmartSsoServerApplication.java,右键 → Run控制台输出类似: Started SmartSsoServerApplication in 5.234 seconds
- 
测试端点 在浏览器访问: - 
测试 1:http://localhost:8080/api/hello 预期输出:Hello, Smart SSO Server is running!
- 
测试 2:http://localhost:8080/api/env { "mysql": "connected", "redis": "connected", "timestamp": "2025-01-08T10:30:00" }
 如果两个测试都通过,恭喜你,环境搭建成功! 
- 
二、OAuth 2.0 概念学习
在开始编码前,请务必理解以下核心概念:
1. OAuth 2.0 基本概念
核心角色:
- Resource Owner(资源所有者):用户
- Client(客户端):第三方应用
- Authorization Server(授权服务器):本项目要实现的 SSO 服务器
- Resource Server(资源服务器):受保护的 API 服务器
核心令牌:
- Authorization Code(授权码):临时凭证,生命周期短(如 5 分钟)
- Access Token(访问令牌):访问 API 的凭证,生命周期短(如 15 分钟)
- Refresh Token(刷新令牌):刷新访问令牌的凭证,生命周期长(如 30 天)
2. 授权码模式流程图
+----------+                                      +---------------+
|          |---(A) 授权请求 ---------------------->|               |
|          |      (client_id, redirect_uri,       |  Authorization|
|  User    |       code_challenge)                |     Server    |
|  Agent   |                                      |   (SSO Server)|
|          |<--(B) 授权码 -------------------------|               |
|          |      (code)                          |               |
+----------+                                      +---------------+
     |                                                     ^
     |                                                     |
     v                                                     |
+----------+                                               |
|          |--(C) 授权码 + 验证器 ---------------------->|
|  Client  |      (code, code_verifier,
|   App    |       client_id, client_secret)              |
|          |                                               |
|          |<--(D) 访问令牌 + 刷新令牌 ------------------|
+----------+      (access_token, refresh_token)
3. 必读材料
请按顺序阅读以下材料(约需 2-3 小时):
- ✅ 理解OAuth 2.0 - 阮一峰(入门)
- ✅ OAuth 2.0 详解 - 廖雪峰(进阶)
- ✅ RFC 6749 - 第4.1节(授权码模式标准)
- ✅ PKCE 详解(安全增强)
4. 系统整体设计
本项目的模块划分:
smart-sso-starter-server/
├── controller/          # 控制器层
│   ├── AuthorizeController.java    # 授权端点
│   ├── TokenController.java        # 令牌端点
│   └── LogoutController.java       # 登出端点
├── service/             # 服务层
│   ├── UserService.java            # 用户验证
│   ├── AppService.java             # 客户端验证
│   ├── TicketGrantingTicketManager # TGT 管理
│   ├── CodeManager                 # 授权码管理
│   └── TokenManager                # 令牌管理
├── entity/              # 实体类
│   ├── User.java
│   ├── App.java
│   └── TokenContent.java
└── config/              # 配置类
    └── SecurityConfig.java
关键流程:
- 用户在客户端应用点击"登录"
- 客户端重定向用户到 /oauth/authorize
- 用户输入账号密码,SSO 服务器验证
- 验证成功后颁发授权码,重定向回客户端
- 客户端后端拿授权码到 /oauth/token换取令牌
- 客户端使用访问令牌调用 API
三、预习下周内容
下周我们将实现用户和客户端的验证逻辑,请提前了解:
- BCrypt 密码加密算法
- Spring Security 的 PasswordEncoder
- 缓存在账户锁定中的应用
常见问题 (FAQ)
Q1:Maven 下载依赖很慢怎么办?
A1:配置阿里云镜像(见上文 Maven 配置)。如果已配置仍然慢,可能是网络问题,建议使用代理或切换网络。
Q2:MySQL 连接报错 “Public Key Retrieval is not allowed”
A2:在 JDBC URL 中添加 allowPublicKeyRetrieval=true:
jdbc:mysql://localhost:3306/smart_sso?allowPublicKeyRetrieval=true&useSSL=false
Q3:Redis 连接失败
A3:检查 Redis 是否启动:
redis-cli ping
# 应返回 PONG
如果返回错误,重启 Redis:
# macOS/Linux
sudo systemctl restart redis
# Windows
net stop Redis
net start Redis
Q4:IDEA 无法识别 Lombok 注解
A4:
- 安装 Lombok 插件:Settings → Plugins → Lombok
- 启用注解处理:Settings → Build, Execution, Deployment → Compiler → Annotation Processors → Enable annotation processing
Q5:项目启动后访问 localhost:8080 显示 404
A5:检查:
- 控制台是否有错误日志
- application.yml 配置是否正确
- 数据库和 Redis 连接是否正常
总结
完成本实验后,你应该:
- ✅ 拥有完整的 Java 开发环境
- ✅ 理解 OAuth 2.0 的核心概念
- ✅ 了解本项目的整体架构
- ✅ 能够成功运行项目并通过环境测试
如有任何问题,请在 GitHub Issues 中提问,并附上详细的错误日志和环境信息。
下周见!👋