This commit is contained in:
Paidax
2025-04-03 16:33:07 +08:00
parent cd0b54950a
commit 45a16bf564
2 changed files with 47 additions and 40 deletions
@@ -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");
@@ -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");
}
}