From 45a16bf5646a6c32c5b7fdbfa289d5eff3a402c2 Mon Sep 17 00:00:00 2001 From: Paidax Date: Thu, 3 Apr 2025 16:33:07 +0800 Subject: [PATCH] commit --- .../java/io/v/nutz/base/utils/LoginUtil.java | 18 +++++ .../platform/sys/SysWechatController.java | 69 ++++++++----------- 2 files changed, 47 insertions(+), 40 deletions(-) diff --git a/src/main/java/io/v/nutz/base/utils/LoginUtil.java b/src/main/java/io/v/nutz/base/utils/LoginUtil.java index cfe013b..a8d5c0a 100644 --- a/src/main/java/io/v/nutz/base/utils/LoginUtil.java +++ b/src/main/java/io/v/nutz/base/utils/LoginUtil.java @@ -1,5 +1,6 @@ package io.v.nutz.base.utils; +import cn.hutool.core.util.StrUtil; import io.v.nutz.sys.models.Sys_log; import io.v.nutz.sys.models.Sys_user; import io.v.nutz.sys.services.SysUserService; @@ -15,6 +16,7 @@ import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; import org.nutz.lang.Times; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -46,6 +48,19 @@ public class LoginUtil { * @param loginOrigin 登录起源 */ public void doLogin(AuthenticationToken token, HttpServletRequest request, HttpSession session, LoginOrigin loginOrigin) { + doLogin(token, request, session, loginOrigin, null); + } + + + /** + * 密码登录 + * + * @param token 令牌 + * @param request 请求 + * @param session 会话 + * @param loginOrigin 登录起源 + */ + public void doLogin(AuthenticationToken token, HttpServletRequest request, HttpSession session, LoginOrigin loginOrigin, String openid) { //设置登录源 PlatformCaptchaToken platformCaptchaToken = (PlatformCaptchaToken) token; @@ -61,6 +76,9 @@ public class LoginUtil { Sys_user user = (Sys_user) subject.getPrincipal(); int count = user.getLoginCount() == null ? 0 : user.getLoginCount(); org.nutz.dao.Chain userUpdateChain = Chain.make("loginIp", user.getLoginIp()).add("loginAt", Times.getTS()).add("loginCount", count + 1).add("userOnline", true).add("loginSessionId", session.getId()); + if (StrUtil.isNotBlank(openid)) { + userUpdateChain.add("openId", openid).add("weAppLoginCount", user.getWeAppLoginCount() + 1); + } sysUserService.update(userUpdateChain, Cnd.where("id", "=", user.getId())); Sys_log sysLog = new Sys_log(); sysLog.setType("info"); diff --git a/src/main/java/io/v/nutz/sys/controllers/platform/sys/SysWechatController.java b/src/main/java/io/v/nutz/sys/controllers/platform/sys/SysWechatController.java index 2737fbd..931b6ca 100644 --- a/src/main/java/io/v/nutz/sys/controllers/platform/sys/SysWechatController.java +++ b/src/main/java/io/v/nutz/sys/controllers/platform/sys/SysWechatController.java @@ -4,27 +4,31 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import cn.hutool.socket.SocketUtil; import io.v.nutz.base.payment.wxpay.util.WeChatUtils; +import io.v.nutz.base.result.Result; import io.v.nutz.base.utils.LoginUtil; import io.v.nutz.sys.models.Sys_user; import io.v.nutz.sys.services.SysUserService; import io.v.nutz.web.commons.base.Globals; +import io.v.nutz.web.commons.shiro.exception.CaptchaEmptyException; +import io.v.nutz.web.commons.shiro.exception.CaptchaIncorrectException; import io.v.nutz.web.commons.slog.SLogService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.math.NumberUtils; +import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.LockedAccountException; import org.apache.shiro.authc.UnknownAccountException; -import org.jasig.cas.client.util.AbstractCasFilter; -import org.jasig.cas.client.validation.Assertion; -import org.nutz.dao.Chain; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.integration.jedis.RedisService; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; -import org.nutz.lang.Lang; +import org.nutz.lang.Strings; import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Attr; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; @@ -159,47 +163,32 @@ public class SysWechatController { @At @Ok("re") - public String doLogin(HttpSession session, - @Param("redirect") String redirect, - @Param("state") String state, - HttpServletRequest request) { - - Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION); - if (assertion == null) { - return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError"; - } - - String principal = assertion.getPrincipal().toString(); - - //工号 手机号 身份证 - Sys_user user = dao.fetch(Sys_user.class, Cnd.NEW().and("loginname", "=", principal).or("mobile", "=", principal).or("idcard", "=", principal)); - String loginName = Optional.ofNullable(user).map(Sys_user::getLoginname).orElse(null); - - if (Lang.isEmpty(user)) { - return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError"; - } + public Result doLogin(@Attr("platformLoginToken") AuthenticationToken token, HttpServletRequest request, HttpSession session, @Param("state") String state) { + System.out.println(state); + int errCount = NumberUtils.toInt(Strings.sNull(SecurityUtils.getSubject().getSession(true).getAttribute("platformErrCount"))); try { - loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN); - //绑定openId - if (StrUtil.isNotBlank(state)) { - String openId = weChatUtils.decrypt(state); - dao.update(Sys_user.class, Chain.make("openId", openId).add("weAppLoginCount", user.getWeAppLoginCount() + 1), Cnd.where("loginname", "=", loginName)); - } - if (StrUtil.isNotBlank(redirect)) { - return ">>:" + redirect; - } - return ">>:" + Globals.AppDomain + "/mobile/index"; + String decrypt = weChatUtils.decrypt(state); + loginUtil.doLogin(token, request, session, LoginUtil.LoginOrigin.WEI_XIN, decrypt); + return Result.success("login.success"); + } catch (CaptchaIncorrectException e) { + return Result.error(1, "login.error.captcha"); + } catch (CaptchaEmptyException e) { + return Result.error(2, "验证码为空"); } catch (LockedAccountException e) { - request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试"); - return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError"; + return Result.error(3, "login.error.locked"); } catch (UnknownAccountException e) { - request.setAttribute("errMsg", "系统中没有此用户"); - return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError"; + errCount++; + SecurityUtils.getSubject().getSession(true).setAttribute("platformErrCount", errCount); + return Result.error(4, "login.error.user"); + } catch (AuthenticationException e) { + errCount++; + SecurityUtils.getSubject().getSession(true).setAttribute("platformErrCount", errCount); + return Result.error(5, "login.error.user"); } catch (Exception e) { - e.printStackTrace(); - request.setAttribute("errMsg", "用户名或密码错误"); - return ">>:" + Globals.AppDomain + "/platform/home/500"; + errCount++; + SecurityUtils.getSubject().getSession(true).setAttribute("platformErrCount", errCount); + return Result.error(6, "login.error.system"); } }