| src/main/java/com/nq/controller/AdminApiController.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/nq/pojo/GoogleAuthDto.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/nq/pojo/SiteAdmin.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/nq/service/ISiteAdminService.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java | ●●●●● patch | view | raw | blame | history |
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(); } // //页面样式设置 src/main/java/com/nq/pojo/GoogleAuthDto.java
New file @@ -0,0 +1,14 @@ package com.nq.pojo; import lombok.Data; @Data public class GoogleAuthDto { //密钥 private String googleAuthSecret; //密钥 private String googleAuthImg; } 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; } src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java
New file @@ -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; } src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java
New file @@ -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; } 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); } 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) {