公众号免登录
This commit is contained in:
@@ -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.base.Globals;
|
||||||
import io.v.nutz.web.commons.slog.SLogService;
|
import io.v.nutz.web.commons.slog.SLogService;
|
||||||
import org.apache.shiro.authc.AuthenticationException;
|
import org.apache.shiro.authc.AuthenticationException;
|
||||||
import org.apache.shiro.authc.AuthenticationToken;
|
|
||||||
import org.apache.shiro.authc.LockedAccountException;
|
import org.apache.shiro.authc.LockedAccountException;
|
||||||
import org.apache.shiro.authc.UnknownAccountException;
|
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.Cnd;
|
||||||
import org.nutz.dao.Dao;
|
import org.nutz.dao.Dao;
|
||||||
import org.nutz.integration.jedis.RedisService;
|
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.json.Json;
|
||||||
import org.nutz.lang.util.NutMap;
|
import org.nutz.lang.util.NutMap;
|
||||||
import org.nutz.mvc.annotation.At;
|
import org.nutz.mvc.annotation.At;
|
||||||
import org.nutz.mvc.annotation.Attr;
|
|
||||||
import org.nutz.mvc.annotation.Ok;
|
import org.nutz.mvc.annotation.Ok;
|
||||||
import org.nutz.mvc.annotation.Param;
|
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 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";
|
private static final String SECRET = "f65bbb41d3de4a93c8c93d8e2fd50369";
|
||||||
|
|
||||||
|
|
||||||
@@ -72,11 +74,11 @@ public class SysWechatController {
|
|||||||
@Ok("re")
|
@Ok("re")
|
||||||
public String oauth(@Param("redirectUrl") String redirectUrl) {
|
public String oauth(@Param("redirectUrl") String redirectUrl) {
|
||||||
String redirect = Globals.AppDomain + "/platform/wechat/getCode";
|
String redirect = Globals.AppDomain + "/platform/wechat/getCode";
|
||||||
if (StrUtil.isNotBlank(redirect)) {
|
if (StrUtil.isNotBlank(redirectUrl)) {
|
||||||
redirect += "?redirect=" + redirect;
|
redirect += "?redirect=" + redirectUrl;
|
||||||
}
|
}
|
||||||
String codeUrl = weChatUtils.getCodeUrl(redirect, "");
|
String oauthUrl = weChatUtils.getCodeUrl(redirect, "");
|
||||||
return "redirect:" + codeUrl;
|
return "redirect:" + oauthUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -111,18 +113,17 @@ public class SysWechatController {
|
|||||||
if (StrUtil.isNotBlank(redirect)) {
|
if (StrUtil.isNotBlank(redirect)) {
|
||||||
s += "&redirect=" + URLEncoder.encode(redirect, StandardCharsets.UTF_8);
|
s += "&redirect=" + URLEncoder.encode(redirect, StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
// return ">>:" + Globals.CasAddress + "/login?service=" + URLEncoder.encode(s, StandardCharsets.UTF_8);
|
return ">>:" + Globals.CasAddress + "/login?service=" + URLEncoder.encode(s, StandardCharsets.UTF_8);
|
||||||
return ">>:" + s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String loginName = Optional.ofNullable(sysUser).map(x -> x.getLoginname()).orElse(null);
|
String loginName = Optional.ofNullable(sysUser).map(Sys_user::getLoginname).orElse(null);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN);
|
loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN);
|
||||||
if (StrUtil.isNotBlank(redirect)) {
|
if (StrUtil.isNotBlank(redirect)) {
|
||||||
return ">>:" + redirect;
|
return ">>:" + redirect;
|
||||||
}
|
}
|
||||||
return ">>:" + Globals.AppDomain + "/platform/home";
|
return ">>:" + Globals.AppDomain + "/mobile/index";
|
||||||
} catch (LockedAccountException e) {
|
} catch (LockedAccountException e) {
|
||||||
request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试");
|
request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试");
|
||||||
return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError";
|
return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError";
|
||||||
@@ -141,66 +142,43 @@ public class SysWechatController {
|
|||||||
|
|
||||||
@At
|
@At
|
||||||
@Ok("re")
|
@Ok("re")
|
||||||
public Object doLogin(@Attr("platformLoginToken") AuthenticationToken token,
|
public String doLogin(HttpSession session,
|
||||||
HttpServletRequest request, HttpSession session,
|
@Param("redirect") String redirect,
|
||||||
@Param("redirect") String redirect, @Param("openid") String openid) {
|
@Param("openid") String openid,
|
||||||
// int errCount = NumberUtils.toInt(Strings.sNull(SecurityUtils.getSubject().getSession(true).getAttribute("platformErrCount")));
|
HttpServletRequest request) {
|
||||||
// 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");
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
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);
|
String principal = assertion.getPrincipal().toString();
|
||||||
// if (assertion == null) {
|
|
||||||
// return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError";
|
//工号 手机号 身份证
|
||||||
// }
|
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);
|
||||||
// String principal = assertion.getPrincipal().toString();
|
|
||||||
// //工号 手机号 身份证
|
try {
|
||||||
// Sys_user user = dao.fetch(Sys_user.class, Cnd.NEW().and("loginname", "=", principal).or("mobile", "=", principal).or("idcard", "=", principal));
|
loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN);
|
||||||
// String loginName = Optional.ofNullable(user).map(v -> v.getLoginname()).orElse(null);
|
//绑定openId
|
||||||
//
|
if (StrUtil.isNotBlank(openid)) {
|
||||||
// try {
|
dao.update(Sys_user.class, Chain.make("openId", openid), Cnd.where("loginName", "=", loginName));
|
||||||
// loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN);
|
}
|
||||||
// //绑定openId
|
if (StrUtil.isNotBlank(redirect)) {
|
||||||
// if (StrUtil.isNotBlank(openid)) {
|
return ">>:" + redirect;
|
||||||
// dao.update(Sys_user.class, Chain.make("openId", openid), Cnd.where("loginName", "=", loginName));
|
}
|
||||||
// }
|
return ">>:" + Globals.AppDomain + "/mobile/index";
|
||||||
// if (StrUtil.isNotBlank(redirect)) {
|
} catch (LockedAccountException e) {
|
||||||
// return ">>:" + redirect;
|
request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试");
|
||||||
// }
|
return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError";
|
||||||
// return ">>:" + Globals.AppDomain + "/mobile/index";
|
} catch (UnknownAccountException e) {
|
||||||
// } catch (LockedAccountException e) {
|
request.setAttribute("errMsg", "系统中没有此用户");
|
||||||
// request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试");
|
return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError";
|
||||||
// return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError";
|
} catch (Exception e) {
|
||||||
// } catch (UnknownAccountException e) {
|
e.printStackTrace();
|
||||||
// request.setAttribute("errMsg", "系统中没有此用户");
|
request.setAttribute("errMsg", "用户名或密码错误");
|
||||||
// return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError";
|
return ">>:" + Globals.AppDomain + "/platform/home/500";
|
||||||
// } catch (Exception e) {
|
}
|
||||||
// request.setAttribute("errMsg", "用户名或密码错误");
|
|
||||||
// return ">>:" + Globals.AppDomain + "/platform/home/500";
|
|
||||||
// }
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package io.v.nutz.web.commons.base;
|
package io.v.nutz.web.commons.base;
|
||||||
|
|
||||||
import io.v.nutz.base.enums.Env;
|
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_config;
|
||||||
import io.v.nutz.sys.models.Sys_gx;
|
import io.v.nutz.sys.models.Sys_gx;
|
||||||
import io.v.nutz.sys.models.Sys_route;
|
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.SysConfigService;
|
||||||
import io.v.nutz.sys.services.SysRouteService;
|
import io.v.nutz.sys.services.SysRouteService;
|
||||||
import io.v.nutz.sys.services.SysTaskService;
|
import io.v.nutz.sys.services.SysTaskService;
|
||||||
|
import io.v.nutz.task.services.TaskPlatformService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.nutz.dao.Cnd;
|
import org.nutz.dao.Cnd;
|
||||||
import org.nutz.ioc.impl.PropertiesProxy;
|
import org.nutz.ioc.impl.PropertiesProxy;
|
||||||
@@ -53,7 +53,7 @@ public class Globals {
|
|||||||
//项目短名称
|
//项目短名称
|
||||||
public static String AppShrotName = "";
|
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
|
//cas地址 //http://noa.hrbnu.edu.cn/login/OAlogin.jsp#/?_key=vbuw0p
|
||||||
public static String CasAddress = "http://pass.hrbnu.edu.cn/tpass";
|
public static String CasAddress = "http://pass.hrbnu.edu.cn/tpass";
|
||||||
//文件访问域名
|
//文件访问域名
|
||||||
|
|||||||
@@ -12,7 +12,10 @@ import org.nutz.integration.shiro.NutShiro;
|
|||||||
import org.nutz.integration.shiro.NutShiroInterceptor;
|
import org.nutz.integration.shiro.NutShiroInterceptor;
|
||||||
import org.nutz.integration.shiro.NutShiroMethodInterceptor;
|
import org.nutz.integration.shiro.NutShiroMethodInterceptor;
|
||||||
import org.nutz.lang.Lang;
|
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.annotation.Ok;
|
||||||
import org.nutz.mvc.impl.processor.AbstractProcessor;
|
import org.nutz.mvc.impl.processor.AbstractProcessor;
|
||||||
import org.nutz.mvc.view.ServerRedirectView;
|
import org.nutz.mvc.view.ServerRedirectView;
|
||||||
@@ -71,6 +74,7 @@ public class NutShiroProcessor extends AbstractProcessor {
|
|||||||
"/platform/login",
|
"/platform/login",
|
||||||
"/platform/login(/doLogin|/logout|/captcha|/mobileLoginSmsCode|/validMobile|/validVerify|/mobileCaptcha)",
|
"/platform/login(/doLogin|/logout|/captcha|/mobileLoginSmsCode|/validMobile|/validVerify|/mobileCaptcha)",
|
||||||
"/platform/qywechat/.*",
|
"/platform/qywechat/.*",
|
||||||
|
"/platform/wechat/.*",
|
||||||
"/platform/home/(500|403|404|UnknownAccountError|LockedAccountError)",
|
"/platform/home/(500|403|404|UnknownAccountError|LockedAccountError)",
|
||||||
"/mobile/login",
|
"/mobile/login",
|
||||||
"/mobile/login/doLogin",
|
"/mobile/login/doLogin",
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ public class EasyCredentialsMatch extends HashedCredentialsMatcher {
|
|||||||
LoginUtil.LoginOrigin loginOrigin = platformCaptchaToken.getLoginOrigin();
|
LoginUtil.LoginOrigin loginOrigin = platformCaptchaToken.getLoginOrigin();
|
||||||
|
|
||||||
//cas和企业微信实现免密登录
|
//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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,13 +37,9 @@ public class EasyCredentialsMatch extends HashedCredentialsMatcher {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loginOrigin.equals(LoginUtil.LoginOrigin.SMS_CODE)) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
Object tokenHashedCredentials = hashProvidedCredentials(token, info);
|
Object tokenHashedCredentials = hashProvidedCredentials(token, info);
|
||||||
Object accountCredentials = getCredentials(info);
|
Object accountCredentials = getCredentials(info);
|
||||||
return equals(tokenHashedCredentials, accountCredentials);
|
return equals(tokenHashedCredentials, accountCredentials);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,10 @@ public class PlatformAuthorizingRealm extends AuthorizingRealm {
|
|||||||
throw Lang.makeThrow(AuthenticationException.class, "登录账号不可为空");
|
throw Lang.makeThrow(AuthenticationException.class, "登录账号不可为空");
|
||||||
}
|
}
|
||||||
user = getUserService().fetch(Cnd.NEW().and("loginname", "=", loginname));
|
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));
|
user = getUserService().fetch(Cnd.NEW().and("loginname", "=", loginname));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +119,8 @@ public class PlatformAuthorizingRealm extends AuthorizingRealm {
|
|||||||
throw Lang.makeThrow(LockedAccountException.class, "账号被禁用", loginname);
|
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")));
|
int errCount = NumberUtils.toInt(Strings.sNull(session.getAttribute("platformErrCount")));
|
||||||
if (errCount >= 4) {
|
if (errCount >= 4) {
|
||||||
//输错5次禁用账户10分钟
|
//输错5次禁用账户10分钟
|
||||||
|
|||||||
Reference in New Issue
Block a user