From c951cb4fc418bc03f2eb1acc604d936716f38f84 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Sun, 26 Apr 2026 11:03:31 +0800
Subject: [PATCH] 1
---
src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java | 17 +++
src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java | 68 ++++++++-----
src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java | 21 ++++
src/main/java/com/nq/service/ISiteAdminService.java | 8 +
src/main/java/com/nq/controller/AdminApiController.java | 109 ++++++++++++++++++++-
src/main/java/com/nq/pojo/GoogleAuthDto.java | 14 ++
src/main/java/com/nq/pojo/SiteAdmin.java | 11 ++
7 files changed, 216 insertions(+), 32 deletions(-)
diff --git a/src/main/java/com/nq/controller/AdminApiController.java b/src/main/java/com/nq/controller/AdminApiController.java
index 3820b97..43eda01 100644
--- a/src/main/java/com/nq/controller/AdminApiController.java
+++ b/src/main/java/com/nq/controller/AdminApiController.java
@@ -1,9 +1,13 @@
package com.nq.controller;
import com.nq.common.ServerResponse;
+import com.nq.dao.SiteAdminMapper;
+import com.nq.pojo.GoogleAuthDto;
+import com.nq.pojo.SiteAdmin;
import com.nq.pojo.SiteAdminIndex;
import com.nq.pojo.SiteSpread;
import com.nq.service.*;
+import com.nq.service.impl.GoogleAuthenticator;
import com.nq.utils.PropertiesUtil;
import com.nq.utils.redis.CookieUtils;
import com.nq.utils.redis.JsonUtil;
@@ -14,13 +18,12 @@
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
+import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping({"/api/admin/"})
@@ -47,12 +50,19 @@
@Autowired
SiteAdminIndexService siteAdminIndexService;
+ @Autowired
+ SiteAdminMapper siteAdminMapper;
//管理系统登录
@RequestMapping({"login.do"})
@ResponseBody
- public ServerResponse login(@RequestParam("adminPhone") String adminPhone, @RequestParam("adminPwd") String adminPwd, @RequestParam("verifyCode") String verifyCode, HttpSession httpSession, HttpServletRequest request, HttpServletResponse response) {
- ServerResponse serverResponse = this.iSiteAdminService.login(adminPhone, adminPwd, verifyCode, request);
+ public ServerResponse login(@RequestParam("adminPhone") String adminPhone,
+ @RequestParam("adminPwd") String adminPwd,
+ @RequestParam("verifyCode") String verifyCode,
+ @RequestParam(value = "googleAuthCode", required = false) Integer googleAuthCode,
+ HttpSession httpSession, HttpServletRequest request,
+ HttpServletResponse response) {
+ ServerResponse serverResponse = this.iSiteAdminService.login(adminPhone, adminPwd, verifyCode, googleAuthCode,request);
return serverResponse;
}
@@ -127,6 +137,95 @@
+ /**
+ * 获取当前登录用户
+ * @return
+ */
+ @GetMapping("getAdmin")
+ @ResponseBody
+ public ServerResponse getAdmin(HttpServletRequest request) {
+ String cookie_name = PropertiesUtil.getProperty("admin.cookie.name");
+ SiteAdmin siteAdmin = null;
+ if(StringUtils.isNotEmpty(cookie_name)){
+ String logintoken = CookieUtils.readLoginToken(request, cookie_name);
+ String adminJson = RedisShardedPoolUtils.get(logintoken);
+ siteAdmin = (SiteAdmin) JsonUtil.string2Obj(adminJson, SiteAdmin.class);
+ siteAdmin = siteAdminMapper.selectById(siteAdmin.getId());
+ }
+ return ServerResponse.createBySuccess(siteAdmin);
+ }
+
+
+ /**
+ * 获取谷歌验证码密钥
+ * @return
+ */
+ @GetMapping("getLoginGoogleAuthSecret")
+ @ResponseBody
+ public ServerResponse getLoginGoogleAuthSecret(HttpServletRequest request) {
+ GoogleAuthDto dto = iSiteAdminService.getGoogleAuth(request);
+ return ServerResponse.createBySuccess(dto);
+ }
+
+ /**
+ * 绑定谷歌验证码
+ */
+ @PostMapping("bindGoogleAuth")
+ @ResponseBody
+ public ServerResponse updateGoogleAuth(@RequestParam("id") String id,
+ @RequestParam("googleAuthCode") String googleAuthCode,
+ @RequestParam("secret") String secret) {
+ SiteAdmin siteAdmin = siteAdminMapper.selectById(id);
+ if (siteAdmin == null) {
+ return ServerResponse.createByErrorMsg("当前用户未找到");
+ }
+ long t = System.currentTimeMillis();
+ GoogleAuthenticator ga = new GoogleAuthenticator();
+ ga.setWindowSize(5);
+ if (siteAdmin.getGoogleAuthBind()) {
+ return ServerResponse.createByErrorMsg("谷歌验证码已绑定");
+ }
+ boolean userFlag = ga.check_code(secret, Long.valueOf(googleAuthCode), t);
+ if (!userFlag) {
+ return ServerResponse.createByErrorMsg("谷歌验证码错误");
+ }
+ siteAdmin.setGoogleAuthBind(true);
+ siteAdmin.setGoogleAuthSecret(secret);
+ siteAdminMapper.updateById(siteAdmin);
+ return ServerResponse.createBySuccess();
+ }
+
+
+ /**
+ * 解绑谷歌验证码
+ * @param param
+ * @return
+ */
+ @PostMapping("/unbindingGoogleAuth")
+ @ResponseBody
+ public ServerResponse unbindingGoogleAuth(@RequestParam("id") String id,
+ @RequestParam("rootGoogleAuthCode") String rootGoogleAuthCode) {
+ SiteAdmin siteAdmin = siteAdminMapper.selectById(id);
+ if (siteAdmin == null) {
+ return ServerResponse.createByErrorMsg("当前用户未找到");
+ }
+ long t = System.currentTimeMillis();
+ GoogleAuthenticator ga = new GoogleAuthenticator();
+ ga.setWindowSize(5);
+ boolean flag = ga.check_code(siteAdmin.getGoogleAuthSecret(), Long.valueOf(rootGoogleAuthCode), t);
+ if (flag) {
+ if (!siteAdmin.getGoogleAuthBind()) {
+ return ServerResponse.createByErrorMsg("谷歌验证码未绑定,无需解绑!");
+
+ }
+ siteAdmin.setGoogleAuthBind(false);
+ siteAdmin.setGoogleAuthSecret("");
+ siteAdminMapper.updateById(siteAdmin);
+ } else {
+ return ServerResponse.createByErrorMsg("超级谷歌验证码错误");
+ }
+ return ServerResponse.createBySuccess();
+ }
// //页面样式设置
diff --git a/src/main/java/com/nq/pojo/GoogleAuthDto.java b/src/main/java/com/nq/pojo/GoogleAuthDto.java
new file mode 100644
index 0000000..caa37e7
--- /dev/null
+++ b/src/main/java/com/nq/pojo/GoogleAuthDto.java
@@ -0,0 +1,14 @@
+package com.nq.pojo;
+
+import lombok.Data;
+
+@Data
+public class GoogleAuthDto {
+
+
+ //密钥
+ private String googleAuthSecret;
+
+ //密钥
+ private String googleAuthImg;
+}
diff --git a/src/main/java/com/nq/pojo/SiteAdmin.java b/src/main/java/com/nq/pojo/SiteAdmin.java
index 3a5fa95..fea278a 100644
--- a/src/main/java/com/nq/pojo/SiteAdmin.java
+++ b/src/main/java/com/nq/pojo/SiteAdmin.java
@@ -1,6 +1,7 @@
package com.nq.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Date;
@@ -15,6 +16,14 @@
private Date addTime;
private String token;
-
+ /**
+ * 谷歌验证器
+ */
+ @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
+ private String googleAuthSecret;
+ /**
+ * 谷歌验证器是否绑定
+ */
+ private Boolean googleAuthBind=false;
}
diff --git a/src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java b/src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java
new file mode 100644
index 0000000..e808c12
--- /dev/null
+++ b/src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java
@@ -0,0 +1,17 @@
+package com.nq.pojo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class UnbindingGoogleAuthModel {
+
+
+ private long id;
+
+
+ //谷歌验证码
+ @NotBlank
+ private String rootGoogleAuthCode;
+}
diff --git a/src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java b/src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java
new file mode 100644
index 0000000..f8b369b
--- /dev/null
+++ b/src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java
@@ -0,0 +1,21 @@
+package com.nq.pojo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class UpdateGoogleAuthDto {
+
+
+ private long id;
+
+ //谷歌密钥
+ @NotBlank
+ private String secret;
+
+
+ //验证码
+ private String googleAuthCode;
+
+}
diff --git a/src/main/java/com/nq/service/ISiteAdminService.java b/src/main/java/com/nq/service/ISiteAdminService.java
index 07329f9..7a6b0a3 100644
--- a/src/main/java/com/nq/service/ISiteAdminService.java
+++ b/src/main/java/com/nq/service/ISiteAdminService.java
@@ -3,12 +3,15 @@
import com.github.pagehelper.PageInfo;
import com.nq.common.ServerResponse;
+import com.nq.pojo.GoogleAuthDto;
import com.nq.pojo.SiteAdmin;
import javax.servlet.http.HttpServletRequest;
public interface ISiteAdminService {
- ServerResponse login(String paramString1, String paramString2, String paramString3, HttpServletRequest paramHttpServletRequest);
+
+
+ ServerResponse login(String paramString1, String paramString2, String paramString3, Integer googleAuthCode,HttpServletRequest paramHttpServletRequest);
ServerResponse<PageInfo> listByAdmin(String paramString1, String paramString2, HttpServletRequest paramHttpServletRequest, int paramInt1, int paramInt2);
@@ -29,4 +32,7 @@
ServerResponse deleteAdmin(Integer adminId);
ServerResponse moneyCount(String agentId, String startTime, String entTime);
+
+ GoogleAuthDto getGoogleAuth(HttpServletRequest request);
+
}
diff --git a/src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java b/src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java
index 863377c..958d9f4 100644
--- a/src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java
@@ -1,6 +1,9 @@
package com.nq.service.impl;
import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.nq.dao.*;
@@ -30,6 +33,7 @@
import com.nq.utils.PropertiesUtil;
import com.nq.utils.SymmetricCryptoUtil;
+import com.nq.utils.redis.CookieUtils;
import com.nq.utils.redis.JsonUtil;
import com.nq.utils.redis.RedisConst;
import com.nq.utils.redis.RedisShardedPoolUtils;
@@ -109,53 +113,43 @@
@Autowired
AgentUserMapper agentUserMapper;
- public ServerResponse login(String adminPhone, String adminPwd, String verifyCode, HttpServletRequest request) {
+ public ServerResponse login(String adminPhone, String adminPwd, String verifyCode,Integer googleAuthCode, HttpServletRequest request) {
if (StringUtils.isBlank(verifyCode)) {
-
return ServerResponse.createByErrorMsg("验证码不能为空");
-
}
-//
- String original = (String) request.getSession().getAttribute("KAPTCHA_SESSION_KEY");
- /*if (!verifyCode.equalsIgnoreCase(original)) {
-
- return ServerResponse.createByErrorMsg("验证码错误");
-
- }*/
-
-
- if (StringUtils.isBlank(adminPhone) || StringUtils.isBlank(adminPwd)) {
+ if (StringUtils.isBlank(adminPhone) || StringUtils.isBlank(adminPwd) ) {
return ServerResponse.createByErrorMsg("参数不能为空");
}
-
- SymmetricCryptoUtil.decryptPassword("8OTlTNZ9EwQ29Pf0R8a37Q==");
adminPwd = SymmetricCryptoUtil.encryptPassword(adminPwd);
SiteAdmin siteAdmin = this.siteAdminMapper.login(adminPhone, adminPwd);
-// SiteAdmin siteAdmin = (SiteAdmin) siteAdminMapper.selectOne(new QueryWrapper<SiteAdmin>().eq("admin_phone", adminPhone).eq("admin_pwd", adminPwd));
-
if (siteAdmin == null) {
-
return ServerResponse.createByErrorMsg("账号密码错误");
-
}
-
-
if (siteAdmin.getIsLock().intValue() == 1) {
-
return ServerResponse.createByErrorMsg("账号已被锁定");
-
}
-
+ if(siteAdmin.getGoogleAuthBind() && ObjectUtil.isEmpty(googleAuthCode)){
+ return ServerResponse.createByErrorMsg("谷歌验证码不能为空");
+ }
+ if(siteAdmin.getGoogleAuthBind()){
+ long t = System.currentTimeMillis();
+ GoogleAuthenticator ga = new GoogleAuthenticator();
+ ga.setWindowSize(5);
+ boolean userFlag = ga.check_code(siteAdmin.getGoogleAuthSecret(), Long.valueOf(googleAuthCode), t);
+ if (!userFlag) {
+ return ServerResponse.createByErrorMsg("谷歌验证码错误!");
+ }
+ }
siteAdmin.setAdminPwd(null);
HttpSession httpSession = request.getSession();
String token = RedisConst.getAdminRedisKey(httpSession.getId());
- String str = RedisShardedPoolUtils.setEx(token,
+ RedisShardedPoolUtils.setEx(token,
JsonUtil.obj2String(siteAdmin), 999999);
@@ -164,6 +158,30 @@
}
+ @Override
+ public GoogleAuthDto getGoogleAuth(HttpServletRequest request) {
+ String secretKey = GoogleAuthenticator.generateSecretKey();
+ QrConfig config = new QrConfig(345, 345);
+ config.setMargin(3);
+ String cookie_name = PropertiesUtil.getProperty("admin.cookie.name");
+ SiteAdmin siteAdmin = null;
+ if(StringUtils.isNotEmpty(cookie_name)){
+ siteAdmin = getAdmin(cookie_name,request);
+ }
+ String content = String.format("otpauth://totp/%s?secret=%s", siteAdmin.getAdminName(),secretKey);
+ String base64 = QrCodeUtil.generateAsBase64(content, config, "png");
+ GoogleAuthDto dto = new GoogleAuthDto();
+ dto.setGoogleAuthImg(base64);
+ dto.setGoogleAuthSecret(secretKey);
+ return dto;
+ }
+
+ public SiteAdmin getAdmin(String cookie_name,HttpServletRequest request){
+ String logintoken = CookieUtils.readLoginToken(request, cookie_name);
+ String adminJson = RedisShardedPoolUtils.get(logintoken);
+ return (SiteAdmin) JsonUtil.string2Obj(adminJson, SiteAdmin.class);
+ }
+
public ServerResponse<PageInfo> listByAdmin(String adminName, String adminPhone, HttpServletRequest request, int pageNum, int pageSize) {
--
Gitblit v1.9.3