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 81e217b..2fa87bc 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 @@ -10,9 +10,11 @@ import io.v.nutz.sys.services.SysUserService; import io.v.nutz.web.commons.base.Globals; import io.v.nutz.web.commons.slog.SLogService; 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; @@ -21,7 +23,6 @@ import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; 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; @@ -45,8 +46,9 @@ public class SysWechatController { private static String ACCESS_TOKEN_URL = "https://%s/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code"; - private static final String APPID = "wxf12fa6175ec7c75f"; - + // 哈师大公众号appid + private static final String APPID = "wx0ad18b7f3c9ad6ab"; + // 哈师大公众号app_secret 还未修改 private static final String SECRET = "f65bbb41d3de4a93c8c93d8e2fd50369"; @@ -72,11 +74,11 @@ public class SysWechatController { @Ok("re") public String oauth(@Param("redirectUrl") String redirectUrl) { String redirect = Globals.AppDomain + "/platform/wechat/getCode"; - if (StrUtil.isNotBlank(redirect)) { - redirect += "?redirect=" + redirect; + if (StrUtil.isNotBlank(redirectUrl)) { + redirect += "?redirect=" + redirectUrl; } - String codeUrl = weChatUtils.getCodeUrl(redirect, ""); - return "redirect:" + codeUrl; + String oauthUrl = weChatUtils.getCodeUrl(redirect, ""); + return "redirect:" + oauthUrl; } /** @@ -111,18 +113,17 @@ public class SysWechatController { if (StrUtil.isNotBlank(redirect)) { s += "&redirect=" + URLEncoder.encode(redirect, StandardCharsets.UTF_8); } -// return ">>:" + Globals.CasAddress + "/login?service=" + URLEncoder.encode(s, StandardCharsets.UTF_8); - return ">>:" + s; + return ">>:" + Globals.CasAddress + "/login?service=" + URLEncoder.encode(s, StandardCharsets.UTF_8); } - String loginName = Optional.ofNullable(sysUser).map(x -> x.getLoginname()).orElse(null); + String loginName = Optional.ofNullable(sysUser).map(Sys_user::getLoginname).orElse(null); try { loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN); if (StrUtil.isNotBlank(redirect)) { return ">>:" + redirect; } - return ">>:" + Globals.AppDomain + "/platform/home"; + return ">>:" + Globals.AppDomain + "/mobile/index"; } catch (LockedAccountException e) { request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试"); return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError"; @@ -141,66 +142,43 @@ public class SysWechatController { @At @Ok("re") - public Object doLogin(@Attr("platformLoginToken") AuthenticationToken token, - HttpServletRequest request, HttpSession session, - @Param("redirect") String redirect, @Param("openid") String openid) { -// int errCount = NumberUtils.toInt(Strings.sNull(SecurityUtils.getSubject().getSession(true).getAttribute("platformErrCount"))); -// try { -// loginUtil.doLogin(token, request, session, LoginUtil.LoginOrigin.WEI_XIN); -// -// return Result.success("login.success"); -// } catch (CaptchaIncorrectException e) { -// return Result.error(1, "login.error.captcha"); -// } catch (CaptchaEmptyException e) { -// return Result.error(2, "login.error.captcha"); -// } catch (LockedAccountException e) { -// return Result.error(3, "login.error.locked"); -// } catch (UnknownAccountException e) { -// 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) { -// errCount++; -// SecurityUtils.getSubject().getSession(true).setAttribute("platformErrCount", errCount); -// return Result.error(6, "login.error.system"); -// } + public String doLogin(HttpSession session, + @Param("redirect") String redirect, + @Param("openid") String openid, + HttpServletRequest request) { + Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION); + if (assertion == null) { + return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError"; + } -// 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(v -> v.getLoginname()).orElse(null); -// -// try { -// loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN); -// //绑定openId -// if (StrUtil.isNotBlank(openid)) { -// dao.update(Sys_user.class, Chain.make("openId", openid), Cnd.where("loginName", "=", loginName)); -// } -// if (StrUtil.isNotBlank(redirect)) { -// return ">>:" + redirect; -// } -// return ">>:" + Globals.AppDomain + "/mobile/index"; -// } catch (LockedAccountException e) { -// request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试"); -// return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError"; -// } catch (UnknownAccountException e) { -// request.setAttribute("errMsg", "系统中没有此用户"); -// return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError"; -// } catch (Exception e) { -// request.setAttribute("errMsg", "用户名或密码错误"); -// return ">>:" + Globals.AppDomain + "/platform/home/500"; -// } - return null; + 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); + + try { + loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN); + //绑定openId + if (StrUtil.isNotBlank(openid)) { + dao.update(Sys_user.class, Chain.make("openId", openid), Cnd.where("loginName", "=", loginName)); + } + if (StrUtil.isNotBlank(redirect)) { + return ">>:" + redirect; + } + return ">>:" + Globals.AppDomain + "/mobile/index"; + } catch (LockedAccountException e) { + request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试"); + return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError"; + } catch (UnknownAccountException e) { + request.setAttribute("errMsg", "系统中没有此用户"); + return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError"; + } catch (Exception e) { + e.printStackTrace(); + request.setAttribute("errMsg", "用户名或密码错误"); + return ">>:" + Globals.AppDomain + "/platform/home/500"; + } } } diff --git a/src/main/java/io/v/nutz/web/commons/base/Globals.java b/src/main/java/io/v/nutz/web/commons/base/Globals.java index 3230f5b..10c41c6 100644 --- a/src/main/java/io/v/nutz/web/commons/base/Globals.java +++ b/src/main/java/io/v/nutz/web/commons/base/Globals.java @@ -1,7 +1,6 @@ package io.v.nutz.web.commons.base; import io.v.nutz.base.enums.Env; -import io.v.nutz.task.services.TaskPlatformService; import io.v.nutz.sys.models.Sys_config; import io.v.nutz.sys.models.Sys_gx; import io.v.nutz.sys.models.Sys_route; @@ -9,6 +8,7 @@ import io.v.nutz.sys.models.Sys_task; import io.v.nutz.sys.services.SysConfigService; import io.v.nutz.sys.services.SysRouteService; import io.v.nutz.sys.services.SysTaskService; +import io.v.nutz.task.services.TaskPlatformService; import lombok.extern.slf4j.Slf4j; import org.nutz.dao.Cnd; import org.nutz.ioc.impl.PropertiesProxy; @@ -53,7 +53,7 @@ public class Globals { //项目短名称 public static String AppShrotName = ""; //项目域名 (设置一个默认的 为优先级考虑) - public static String AppDomain = "http://zhgh.hrbnu.edu.cn"; + public static String AppDomain = "https://zhgh.hrbnu.edu.cn"; //cas地址 //http://noa.hrbnu.edu.cn/login/OAlogin.jsp#/?_key=vbuw0p public static String CasAddress = "http://pass.hrbnu.edu.cn/tpass"; //文件访问域名 diff --git a/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java b/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java index 875a93b..436253a 100644 --- a/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java +++ b/src/main/java/io/v/nutz/web/commons/proc/NutShiroProcessor.java @@ -12,7 +12,10 @@ import org.nutz.integration.shiro.NutShiro; import org.nutz.integration.shiro.NutShiroInterceptor; import org.nutz.integration.shiro.NutShiroMethodInterceptor; import org.nutz.lang.Lang; -import org.nutz.mvc.*; +import org.nutz.mvc.ActionContext; +import org.nutz.mvc.ActionInfo; +import org.nutz.mvc.NutConfig; +import org.nutz.mvc.View; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.impl.processor.AbstractProcessor; import org.nutz.mvc.view.ServerRedirectView; @@ -71,6 +74,7 @@ public class NutShiroProcessor extends AbstractProcessor { "/platform/login", "/platform/login(/doLogin|/logout|/captcha|/mobileLoginSmsCode|/validMobile|/validVerify|/mobileCaptcha)", "/platform/qywechat/.*", + "/platform/wechat/.*", "/platform/home/(500|403|404|UnknownAccountError|LockedAccountError)", "/mobile/login", "/mobile/login/doLogin", diff --git a/src/main/java/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.java b/src/main/java/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.java index fe13696..95292b9 100644 --- a/src/main/java/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.java +++ b/src/main/java/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.java @@ -26,7 +26,8 @@ public class EasyCredentialsMatch extends HashedCredentialsMatcher { LoginUtil.LoginOrigin loginOrigin = platformCaptchaToken.getLoginOrigin(); //cas和企业微信实现免密登录 - if (loginOrigin.equals(LoginUtil.LoginOrigin.CAS) || loginOrigin.equals(LoginUtil.LoginOrigin.QI_YE_WEI_XIN) || !loginOrigin.equals(LoginUtil.LoginOrigin.WEI_XIN)) { + if (loginOrigin.equals(LoginUtil.LoginOrigin.CAS) || loginOrigin.equals(LoginUtil.LoginOrigin.QI_YE_WEI_XIN) + || !loginOrigin.equals(LoginUtil.LoginOrigin.WEI_XIN)) { return true; } @@ -36,13 +37,9 @@ public class EasyCredentialsMatch extends HashedCredentialsMatcher { return true; } - if (loginOrigin.equals(LoginUtil.LoginOrigin.SMS_CODE)) { - return true; - } else { - Object tokenHashedCredentials = hashProvidedCredentials(token, info); - Object accountCredentials = getCredentials(info); - return equals(tokenHashedCredentials, accountCredentials); - } + Object tokenHashedCredentials = hashProvidedCredentials(token, info); + Object accountCredentials = getCredentials(info); + return equals(tokenHashedCredentials, accountCredentials); } } diff --git a/src/main/java/io/v/nutz/web/commons/shiro/realm/PlatformAuthorizingRealm.java b/src/main/java/io/v/nutz/web/commons/shiro/realm/PlatformAuthorizingRealm.java index cc1effe..309e98c 100644 --- a/src/main/java/io/v/nutz/web/commons/shiro/realm/PlatformAuthorizingRealm.java +++ b/src/main/java/io/v/nutz/web/commons/shiro/realm/PlatformAuthorizingRealm.java @@ -100,7 +100,10 @@ public class PlatformAuthorizingRealm extends AuthorizingRealm { throw Lang.makeThrow(AuthenticationException.class, "登录账号不可为空"); } user = getUserService().fetch(Cnd.NEW().and("loginname", "=", loginname)); - }else if(loginOrigin.equals(LoginUtil.LoginOrigin.CAS)){ + }else { + if (Strings.isBlank(loginname)) { + throw Lang.makeThrow(AuthenticationException.class, "登录账号不可为空"); + } user = getUserService().fetch(Cnd.NEW().and("loginname", "=", loginname)); } @@ -116,7 +119,8 @@ public class PlatformAuthorizingRealm extends AuthorizingRealm { throw Lang.makeThrow(LockedAccountException.class, "账号被禁用", loginname); } - if (!loginOrigin.equals(LoginUtil.LoginOrigin.CAS) && !loginOrigin.equals(LoginUtil.LoginOrigin.QI_YE_WEI_XIN) && !loginOrigin.equals(LoginUtil.LoginOrigin.WEI_XIN)) { + if (!loginOrigin.equals(LoginUtil.LoginOrigin.CAS) && !loginOrigin.equals(LoginUtil.LoginOrigin.QI_YE_WEI_XIN) + && !loginOrigin.equals(LoginUtil.LoginOrigin.WEI_XIN)) { int errCount = NumberUtils.toInt(Strings.sNull(session.getAttribute("platformErrCount"))); if (errCount >= 4) { //输错5次禁用账户10分钟