# 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,出现如下即可表示运行成功 image-20250617165811258 打开链接,进入登录页面 ## 3、账号密码登录 在未登录的情况下打开链接http://localhost:8024,就会进入登录页面 20250617170158 > 登录账号:kdyzm > > 登录密码:123456 登录成功之后进入首页。 ## 4、开启两步验证 登录成功之后进入首页,点击首页右上角两步验证 20250617170554 进入两步验证页面,由于未设置过二次验证,所以会提示去设置 20250617170716 点击“开启二次验证”按钮,进入两步骤验证向导 20250617170906 点击下一步输入电子邮件 20250617171200 点击下一步,进入关键的验证器配置步骤 20250617171311 在这一步,IOS下可以安装`Authenticator`或者微信小程序搜索“`MFA`”,使用“`腾讯身份验证器`”扫描二维码完成验证器设置,注意,**如果多次扫描相同的二维码,需要删除上次扫描的记录**。 微信图片_20250617151530 点击下一步,校验配置的正确性: 20250617172222 提示配置开启成功即表示已配置成功。 ## 5、验证两步验证 退出登录,回到登录页,输入账号密码登录,登录成功后不再跳转到首页,而是跳转到二次验证页面: 20250617172603 从手机上获取动态验证码,即可成功登录系统。 20250617172715 ## 6、关闭两步验证 进入首页后,再次进入两步验证页面,即可看到关闭按钮 20250617172910 关闭后再次登录系统,就不会进入两步验证页面了。 ## 7、实战总结 由于本项目案例只关注2FA相关的内容,而光年Admin模板的静态模板只实现了登录以及2FA相关的功能,而且时间匆忙代码比较糙。。。 该项目还剩下一些问题没实现 1. 二次验证的记住设备功能 2. 8位数的静态码未实现校验功能 3. 设备丢失静态码找回功能未实现 以后有时间再补充了。