# 2fa-demo
**Repository Path**: kdyzm/2fa-demo
## Basic Information
- **Project Name**: 2fa-demo
- **Description**: 基于笔下光年的Light Year Admin v5模板+SpringBoot+FreeMarker+GooleAuth实现的双因素认证案例
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2025-06-17
- **Last Updated**: 2025-10-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
该项目依赖于MySQL,所以在运行前需要先准备好MySQL环境。
## 1、运行前准备
需要创建Mysql数据库,运行如下脚本:
``` sql
CREATE DATABASE `2fa_demo` ;
USE `2fa_demo`;
CREATE TABLE `sys_user` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',
`nick_name` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户昵称',
`password` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户密码',
`two_fa_secret` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '两步验证的秘钥',
`tow_fa_enabled` tinyint(1) DEFAULT '0' COMMENT '是否启用两步验证',
`create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'sys' COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志,0:未删除;1:已删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';
insert into `sys_user`(`id`,`user_name`,`nick_name`,`password`,`two_fa_secret`,`tow_fa_enabled`,`create_by`,`create_time`,`update_by`,`update_time`,`del_flag`) values
(1,'kdyzm','狂盗一枝梅','123456','H5C7U7M3FJN6DGL6EAAWHF6TVAAINAGU',0,'kdyzm','2025-06-16 13:51:03',NULL,'2025-06-17 13:37:13',0);
CREATE TABLE `sys_user_2fa` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` bigint DEFAULT NULL COMMENT '用户id',
`secret_key` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '秘钥',
`scratch_codes` varchar(128) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '静态验证码',
`create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志,0:未删除;1:已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `unique_user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='两步验证相关临时配置表';
```
之后修改配置文件中的Mysql配置信息:
``` yaml
JDBC_MYSQL_HOST: localhost
JDBC_MYSQL_PORT: 3306
JDBC_MYSQL_DATABASE: 2fa_demo
JDBC_MYSQL_USERNAME: root
JDBC_MYSQL_PASSWORD: '123456'
```
## 2、项目启动
将项目导入Intelij,运行Application,出现如下即可表示运行成功
打开链接,进入登录页面
## 3、账号密码登录
在未登录的情况下打开链接http://localhost:8024,就会进入登录页面
> 登录账号:kdyzm
>
> 登录密码:123456
登录成功之后进入首页。
## 4、开启两步验证
登录成功之后进入首页,点击首页右上角两步验证
进入两步验证页面,由于未设置过二次验证,所以会提示去设置
点击“开启二次验证”按钮,进入两步骤验证向导
点击下一步输入电子邮件
点击下一步,进入关键的验证器配置步骤
在这一步,IOS下可以安装`Authenticator`或者微信小程序搜索“`MFA`”,使用“`腾讯身份验证器`”扫描二维码完成验证器设置,注意,**如果多次扫描相同的二维码,需要删除上次扫描的记录**。
点击下一步,校验配置的正确性:
提示配置开启成功即表示已配置成功。
## 5、验证两步验证
退出登录,回到登录页,输入账号密码登录,登录成功后不再跳转到首页,而是跳转到二次验证页面:
从手机上获取动态验证码,即可成功登录系统。
## 6、关闭两步验证
进入首页后,再次进入两步验证页面,即可看到关闭按钮
关闭后再次登录系统,就不会进入两步验证页面了。
## 7、实战总结
由于本项目案例只关注2FA相关的内容,而光年Admin模板的静态模板只实现了登录以及2FA相关的功能,而且时间匆忙代码比较糙。。。
该项目还剩下一些问题没实现
1. 二次验证的记住设备功能
2. 8位数的静态码未实现校验功能
3. 设备丢失静态码找回功能未实现
以后有时间再补充了。