From b91d9a4033d6b67c943e81d7e3365f8391dfed2b Mon Sep 17 00:00:00 2001 From: chenyanchang <30190327@qq.com> Date: Sun, 24 May 2026 14:49:27 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=96=B0=E5=A2=9Epc=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=EF=BC=8C=E4=BC=81=E4=B8=9A=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95?= =?UTF-8?q?=EF=BC=9B2.=E6=96=B0=E5=A2=9E=E7=9B=91=E7=AE=A1=E7=AB=AF?= =?UTF-8?q?=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysLoginController.java | 18 +- .../src/main/resources/application-dev.yml | 2 + .../src/main/resources/application-local.yml | 5 +- .../ruoyi/cms/service/IAppUserService.java | 2 + .../cms/service/impl/AppUserServiceImpl.java | 5 + .../common/core/domain/entity/SysUser.java | 12 + .../framework/config/SecurityConfig.java | 2 +- .../framework/web/service/SsoService.java | 384 +++++++++++++++--- .../framework/web/service/TokenService.java | 55 ++- .../resources/mapper/system/SysUserMapper.xml | 2 + 10 files changed, 415 insertions(+), 72 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 6b5f498..637fa3a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -300,18 +300,32 @@ public class SysLoginController return loginService.companyLoginOrRegister(loginBody); } - @ApiOperation("单点登录-code") + @ApiOperation("一体机求职者:单点登录-code") @PostMapping("/sso/code/login") public AjaxResult codeLogin(@RequestBody JSONObject param) { JSONObject result = ssoService.ssoCodeLogin(param); return AjaxResult.success(result); } - @ApiOperation("单点登录-token") + @ApiOperation("一体机求职者:单点登录-token") @PostMapping("/sso/token/login") public AjaxResult ssoTokenLogin(@RequestBody JSONObject param) { JSONObject result = ssoService.ssoTokenLogin(param); return AjaxResult.success(result); } + @ApiOperation("pc端个人、企业单点登录-token") + @PostMapping("/sso/pc/code/login") + public AjaxResult ssoPcodeLogin(@RequestBody JSONObject param) { + JSONObject result = ssoService.ssoPcodeLogin(param); + return AjaxResult.success(result); + } + + @ApiOperation("pc端监管单点登录-token") + @PostMapping("/sso/pcms/code/login") + public AjaxResult ssoPcmsCodeLogin(@RequestBody JSONObject param) { + JSONObject result = ssoService.ssoPcmsCodeLogin(param); + return AjaxResult.success(result); + } + } diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index d902801..afc58f3 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -139,3 +139,5 @@ lc_web_auth: lc_cms_auth: appId: cloud-9793ee8a8c3d47b8871007ffc4128502 appSecret: Yi+NACK70UPg8rFvsnnfBUq1wcLD4nm6ilC4II/4C4k= + getTokenUrl: http://100.128.128.6:9081/prod-api/auth/token + getUserInfoUrl: http://100.128.128.6:9081/prod-api/system/app/authorize/user/info diff --git a/ruoyi-admin/src/main/resources/application-local.yml b/ruoyi-admin/src/main/resources/application-local.yml index e58d146..cbd4425 100644 --- a/ruoyi-admin/src/main/resources/application-local.yml +++ b/ruoyi-admin/src/main/resources/application-local.yml @@ -131,12 +131,15 @@ audioText: tts: http://127.0.0.1:19527/synthesize #浪潮单点登录相关 +#互联网端: lc_web_auth: appId: cloud-out-2fb6330e9c0843e1a1424efda5d604c0 appSecret: x14lueHbtLQL7Pz2G7gE4wcGCV6TDblO5xfeu9V2wGk= getTokenUrl: http://218.31.252.15:9081/prod-psout-api/auth/token getUserInfoUrl: http://218.31.252.15:9081/prod-psout-api/system/app/authorize/user/info - +#监管端: lc_cms_auth: appId: cloud-9793ee8a8c3d47b8871007ffc4128502 appSecret: Yi+NACK70UPg8rFvsnnfBUq1wcLD4nm6ilC4II/4C4k= + getTokenUrl: http://218.31.252.15:9081/prod-api/auth/token + getUserInfoUrl: http://218.31.252.15:9081/prod-api/system/app/authorize/user/info diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java index 52a400c..f1fe7b4 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java @@ -70,6 +70,8 @@ public interface IAppUserService public AppUser selectAppuserByIdcard(String idCard); + public AppUser selectAppuserByIdcardAndUserType(String idCard, String userType); + public AppUserLky selectAppUserInfo(AppUser appUser); public AppUser getUserInfo(); diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java index 916c313..879f314 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java @@ -488,6 +488,11 @@ public class AppUserServiceImpl extends ServiceImpl imple return appUserMapper.selectOne(Wrappers.lambdaQuery().eq(AppUser::getIdCard, idCard).eq(AppUser::getDelFlag,"0").orderByDesc(AppUser::getUpdateTime).last("LIMIT 1")); } + @Override + public AppUser selectAppuserByIdcardAndUserType(String idCard, String userType) { + return appUserMapper.selectOne(Wrappers.lambdaQuery().eq(AppUser::getIdCard, idCard).eq(AppUser::getDelFlag,"0").eq(AppUser::getIsCompanyUser, userType).orderByDesc(AppUser::getUpdateTime).last("LIMIT 1")); + } + @Override public AppUserLky selectAppUserInfo(AppUser appUser) { AppUserLky lky=new AppUserLky(); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 3da3fcd..ce2f31c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -73,6 +73,9 @@ public class SysUser extends BaseEntity @Excel(name = "身份证/信用代码") private String idCard; + //appUserId + private Long appUserId; + /** 部门对象 */ @Excels({ @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), @@ -308,6 +311,14 @@ public class SysUser extends BaseEntity this.idCard = idCard; } + public Long getAppUserId() { + return appUserId; + } + + public void setAppUserId(Long appUserId) { + this.appUserId = appUserId; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -331,6 +342,7 @@ public class SysUser extends BaseEntity .append("remark", getRemark()) .append("dept", getDept()) .append("idCard", getIdCard()) + .append("appUserId", getAppUserId()) .toString(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 6e0da95..e395786 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -111,7 +111,7 @@ public class SecurityConfig .authorizeHttpRequests((requests) -> { permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - requests.antMatchers("/sso/token/login","/sso/code/login","/login","/loginoss", "/register", "/captchaImage","/app/login","/websocket/**","/ws/**","/speech-recognition","/speech-synthesis", + requests.antMatchers("/sso/pc/code/login","/sso/pcms/code/login","/sso/token/login","/sso/code/login","/login","/loginoss", "/register", "/captchaImage","/app/login","/websocket/**","/ws/**","/speech-recognition","/speech-synthesis", "/cms/company/listPage","/cms/appUser/noTmlist","/getTjmhToken","/getWwTjmhToken","/getWwTjmHlwToken", "/cms/notice/noticTotal","/cms/jobApply/zphApply","/cms/jobApply/zphApplyAgree").permitAll() // 静态资源,可匿名访问 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SsoService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SsoService.java index 0208dc5..29aa1ff 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SsoService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SsoService.java @@ -1,5 +1,6 @@ package com.ruoyi.framework.web.service; +import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.cms.service.impl.AppUserServiceImpl; import com.ruoyi.cms.util.StringUtil; @@ -10,10 +11,15 @@ import com.ruoyi.common.core.domain.model.LoginSiteUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.encrypt.EncryptUtil; import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.system.domain.SysUserRole; +import com.ruoyi.system.mapper.SysUserRoleMapper; +import com.ruoyi.system.service.impl.SysUserServiceImpl; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.client.methods.CloseableHttpResponse; @@ -27,8 +33,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; -import java.util.concurrent.TimeUnit; +import java.util.List; /** * @Author: chenyanchang @@ -44,9 +51,19 @@ public class SsoService { @Autowired AppUserServiceImpl appUserService; + @Autowired + SysUserServiceImpl sysUserService; + @Autowired private TokenSiteService tokenSiteService; + @Autowired + private TokenService tokenService; + + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + //一体机,pc个人,企业 @Value("${lc_web_auth.appId}") String webAppId; @Value("${lc_web_auth.appSecret}") @@ -56,15 +73,27 @@ public class SsoService { @Value("${lc_web_auth.getUserInfoUrl}") String WEB_GET_USER_INFO; - final String APP_USER_TOKEN_KEY = "app:user:token:"; + //pc监管 + @Value("${lc_cms_auth.appId}") + String cmsAppId; + @Value("${lc_cms_auth.appSecret}") + String cmsAppSecret; + @Value("${lc_cms_auth.getTokenUrl}") + String CMS_GET_TOKEN_URL; + @Value("${lc_cms_auth.getUserInfoUrl}") + String CMS_GET_USER_INFO; + /** + * 一体机单点登录-code + * @param param + * @return + */ public JSONObject ssoCodeLogin(JSONObject param) { if (ObjectUtils.isEmpty(param)) { throw new RuntimeException("请求参数不能为空"); } String code = param.getString("code"); - //String userType = param.getString("userType"); //通过code获取token JSONObject json = new JSONObject(); json.put("code", code); @@ -95,23 +124,28 @@ public class SsoService { } } - //用身份证号查询用户 - AppUser appUser = appUserService.selectAppuserByIdcard(personCardNo); + //用身份证号查询用户 用户类型(01:个人,02:企业) + // 转换成本地:app角色:0企业,1求职者,2网格员 3内部政府人员 4其他(浪潮用) + String userType = userJson.getString("userType"); + userType = "01".equals(userType) ? "1" : "0"; + AppUser appUser = appUserService.selectAppuserByIdcardAndUserType(personCardNo, userType); if (appUser == null) { //用户不存在,则先保存用户 - appUser = saveAppUser(userJson); + appUser = saveAppUser(userJson, userType); } //用户存在,生成本系统用户的token - String token = loginApp(appUser, info.getString("userName")); - //缓存token -// String userKey = APP_USER_TOKEN_KEY + userJson.getString("userId"); -// redisCache.setCacheObject(userKey, token, 2, TimeUnit.HOURS); + String token = loginAppUser(appUser, userJson.getString("userName")); JSONObject backJson = new JSONObject(); backJson.put("token", token); backJson.put("lcToken", lcToken); return backJson; } + /** + * 一体机单点登录-token(浪潮token) + * @param param + * @return + */ public JSONObject ssoTokenLogin(JSONObject param) { if (ObjectUtils.isEmpty(param)) { throw new RuntimeException("请求参数不能为空"); @@ -141,17 +175,167 @@ public class SsoService { } } - //用身份证号查询用户 - AppUser appUser = appUserService.selectAppuserByIdcard(personCardNo); + //用身份证号查询用户 用户类型(01:个人,02:企业) + // 转换成本地:app角色:0企业,1求职者,2网格员 3内部政府人员 4其他(浪潮用) + String userType = userJson.getString("userType"); + userType = "01".equals(userType) ? "1" : "0"; + AppUser appUser = appUserService.selectAppuserByIdcardAndUserType(personCardNo, userType); if (appUser == null) { //用户不存在,则先保存用户 - appUser = saveAppUser(userJson); + appUser = saveAppUser(userJson, userType); } //用户存在,生成本系统用户的token - String token = loginApp(appUser, info.getString("userName")); - //缓存token -// String userKey = APP_USER_TOKEN_KEY + userJson.getString("userId"); -// redisCache.setCacheObject(userKey, token, 2, TimeUnit.HOURS); + String token = loginAppUser(appUser, userJson.getString("userName")); + JSONObject backJson = new JSONObject(); + backJson.put("token", token); + backJson.put("lcToken", lcToken); + return backJson; + } + + /** + * pc端个人、企业单点登录-code + * @param param + * @return + */ + public JSONObject ssoPcodeLogin(JSONObject param) { + if (ObjectUtils.isEmpty(param)) { + throw new RuntimeException("请求参数不能为空"); + } + //浪潮code + String code = param.getString("code"); + //用户类型 + //通过code获取token + JSONObject json = new JSONObject(); + json.put("code", code); + String lcToken = getToken(WEB_GET_TOKEN_URL, null, json.toJSONString()); + if (StringUtils.isEmpty(lcToken)) { + throw new RuntimeException("获取token失败"); + } + //获取用户信息 + JSONObject pJson = new JSONObject(); + pJson.put("appId", webAppId); + pJson.put("appSecret", webAppSecret); + JSONObject userJson = getUserInfo(WEB_GET_USER_INFO, lcToken, pJson.toJSONString()); + if (ObjectUtils.isEmpty(userJson)) { + throw new RuntimeException("获取用户信息失败"); + } + //获取身份证号 + String personCardNo = null; + JSONObject info = null; + if (userJson.containsKey("info")) { + info = userJson.getJSONObject("info"); + if (ObjectUtils.isNotEmpty(info) && info.containsKey("personCardNo")) { + personCardNo = info.getString("personCardNo"); + //解密处理 + if (StringUtils.isEmpty(personCardNo)) { + throw new RuntimeException("获取用户证件信息失败"); + } + personCardNo = EncryptUtil.decryptByAppIdAndSecret(personCardNo, webAppId, webAppSecret); + } + } + + //用身份证号查询用户 用户类型(01:个人,02:企业) + // 转换成本地:app角色:0企业,1求职者,2网格员 3内部政府人员 4其他(浪潮用) + //userType对应appuser的isCompanyUser + String userType = userJson.getString("userType"); + userType = "01".equals(userType) ? "1" : "0"; + //1.先查appuser,不存在,则新增 + AppUser appUser = appUserService.selectAppuserByIdcardAndUserType(personCardNo, userType); + if (appUser == null) { + appUser = saveAppUser(userJson, userType); + } + //2.再查sysuser,不存在,则新增 + SysUser sysUser = sysUserService.selectUserByIdCard(personCardNo); + if (sysUser == null) { + sysUser = saveSysUser(userJson, appUser.getUserId()); + } + //用户存在,生成本系统用户的token + String token = loginSysUser(sysUser, userJson.getString("userName")); + JSONObject backJson = new JSONObject(); + backJson.put("token", token); + backJson.put("lcToken", lcToken); + return backJson; + } + + /** + * pc端监管端单点登录-code + * @param param + * @return + */ + public JSONObject ssoPcmsCodeLogin(JSONObject param) { + if (ObjectUtils.isEmpty(param)) { + throw new RuntimeException("请求参数不能为空"); + } + //浪潮code + String code = param.getString("code"); + //通过code获取token + JSONObject json = new JSONObject(); + json.put("code", code); + String lcToken = getToken(CMS_GET_TOKEN_URL, null, json.toJSONString()); + if (StringUtils.isEmpty(lcToken)) { + throw new RuntimeException("获取token失败"); + } + //获取用户信息 + JSONObject pJson = new JSONObject(); + pJson.put("appId", cmsAppId); + pJson.put("appSecret", cmsAppSecret); + JSONObject userJson = getUserInfo(CMS_GET_USER_INFO, lcToken, pJson.toJSONString()); + if (ObjectUtils.isEmpty(userJson)) { + throw new RuntimeException("获取用户信息失败"); + } + //获取身份证号 + String personCardNo = null; + JSONObject info = null; + if (userJson.containsKey("info")) { + info = userJson.getJSONObject("info"); + if (ObjectUtils.isNotEmpty(info) && info.containsKey("personCardNo")) { + personCardNo = info.getString("personCardNo"); + //解密处理 + if (StringUtils.isEmpty(personCardNo)) { + throw new RuntimeException("获取用户证件信息失败"); + } + personCardNo = EncryptUtil.decryptByAppIdAndSecret(personCardNo, cmsAppId, cmsAppSecret); + } + } + + //用身份证号查询用户 用户类型(01:个人,02:企业) + // 转换成本地:app角色:0企业,1求职者,2网格员 3内部政府人员 4其他(浪潮用) + //取角色判断是网格员2,还是内部工作者3 + String userType = null; + if(userJson.containsKey("roles")) { + JSONObject role = userJson.getJSONArray("roles").getJSONObject(0); + if (role != null && role.containsKey("roleId")) { + /*1101(求职者)、1102(招聘者)、1103(网格员)、1104(内部工作者)*/ + Long roleId = role.getLong("roleId"); + if (roleId != null && roleId.equals(1103L)) { + userType = "2";//2网格员 + } + } + } + + Long appUserId = null; + if (StringUtils.isNotEmpty(userType) && "2".equals(userType)) { + //1.先查appuser,不存在,则新增 + AppUser appUser = appUserService.selectAppuserByIdcardAndUserType(personCardNo, userType); + if (appUser == null) { + appUser = saveAppUser(userJson, userType); + appUserId = appUser.getUserId(); + } + } + //2.再查sysuser,不存在,则新增 + //身份证为空则查userId + SysUser sysUser = null; + if (StringUtils.isNotEmpty(personCardNo)) { + sysUser = sysUserService.selectUserByIdCard(personCardNo); + } else { + sysUser = sysUserService.selectUserById(userJson.getLong("userId")); + } + if (sysUser == null) { + sysUser = saveSysUser(userJson, appUserId); + } + + //用户存在,生成本系统用户的token + String token = loginSysUser(sysUser, userJson.getString("userName")); JSONObject backJson = new JSONObject(); backJson.put("token", token); backJson.put("lcToken", lcToken); @@ -160,36 +344,40 @@ public class SsoService { //获取token private String getToken(String url, String token, String params) { - try { - String result = sendHttpPost(url, token, params); - if (StringUtils.isEmpty(result)) { - throw new RuntimeException("获取token失败"); - } - JSONObject json = JSONObject.parseObject(result); - if (json.getInteger("code") == 200) { - return json.getString("token"); - } else if (json.getInteger("code") == 401) { - throw new RuntimeException("认证过期"); - } else { - throw new RuntimeException("获取token失败"); - } - } catch (Exception e) { - throw new RuntimeException(e.getMessage()); + String result = sendHttpPost(url, token, params); + if (StringUtils.isEmpty(result)) { + throw new RuntimeException("获取token失败"); + } + JSONObject json = JSONObject.parseObject(result); + if (json.getInteger("code") == 200) { + return json.getString("token"); + } else if (json.getInteger("code") == 401) { + throw new RuntimeException("认证过期"); + } else { + throw new RuntimeException("获取token失败"); } } - //模拟登录 - public String loginApp(AppUser appUser, String userName){ + //模拟登录appuser + public String loginAppUser(AppUser appUser, String userName){ LoginSiteUser loginSiteUser = new LoginSiteUser(); loginSiteUser.setUserId(appUser.getUserId()); loginSiteUser.setUser(appUser); -// recordLoginInfo(appUser); AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); -// recordLoginInfo(appUser); // 生成token return tokenSiteService.createTokenHourTwo(loginSiteUser); } + //模拟登录sysuser + public String loginSysUser(SysUser sysUser, String userName){ + LoginUser loginUser = new LoginUser(); + loginUser.setUserId(sysUser.getUserId()); + loginUser.setUser(sysUser); + AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + // 生成token + return tokenService.createTokenHourTwo(loginUser); + } + //获取用户信息 private JSONObject getUserInfo(String url, String token, String params) { try { @@ -210,22 +398,24 @@ public class SsoService { } } - //保存用户 - private AppUser saveAppUser(JSONObject userJson) { - JSONObject info = userJson.getJSONObject("info"); + //保存appuser用户 + private AppUser saveAppUser(JSONObject userJson, String isCompanyUser) { + JSONObject info = userJson.containsKey("info") ? userJson.getJSONObject("info") : null; AppUser appUser = new AppUser(); //app角色:0企业,1求职者,2网格员 3内部政府人员 4其他(浪潮用) - appUser.setIsCompanyUser("1"); + appUser.setIsCompanyUser(isCompanyUser); appUser.setUserId(userJson.getLong("userId")); - appUser.setName(info.getString("personName")); - appUser.setSex(info.getString("personSex")); - appUser.setBirthDate(info.getString("personBirthday")); - appUser.setEducation(StringUtil.convertEducation(info.getString("personEducation"))); - appUser.setPoliticalAffiliation(info.getString("personPolitical")); - appUser.setAddress(info.getString("liveAddress")); - appUser.setWorkExperience(StringUtil.convertExp(info.getInteger("personYearsWorking"))); - appUser.setNation(info.getString("personNation")); - appUser.setDomicileAddress(info.getString("householdAddress")); + appUser.setName(info != null ? info.getString("personName") : userJson.getString("nickName")); + appUser.setSex(info != null ? info.getString("personSex") : userJson.getString("sex")); + if (info != null) { + appUser.setBirthDate(info.getString("personBirthday")); + appUser.setEducation(StringUtil.convertEducation(info.getString("personEducation"))); + appUser.setPoliticalAffiliation(info.getString("personPolitical")); + appUser.setAddress(info.getString("liveAddress")); + appUser.setWorkExperience(StringUtil.convertExp(info.getInteger("personYearsWorking"))); + appUser.setNation(info.getString("personNation")); + appUser.setDomicileAddress(info.getString("householdAddress")); + } String date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()); appUser.setCreateTime(date); appUser.setUpdateTime(date); @@ -234,15 +424,14 @@ public class SsoService { appUser.setLoginIp(IpUtils.getIpAddr()); //获取身份证,再获取年龄 - String personCardNo = info.getString("personCardNo"); + String personCardNo = info != null ? info.getString("personCardNo") : userJson.getString("idCardNo"); //解密处理 if (StringUtils.isNotEmpty(personCardNo)) { personCardNo = EncryptUtil.decryptByAppIdAndSecret(personCardNo, webAppId, webAppSecret); appUser.setAge(StringUtil.getAgeByIdNumber(personCardNo)); appUser.setIdCard(personCardNo); } - String phone = info.getString("personPhone"); - + String phone = info != null ? info.getString("personPhone") : userJson.getString("phonenumber"); //解密电话号码 if (StringUtils.isNotEmpty(phone)) { phone = EncryptUtil.decryptByAppIdAndSecret(phone, webAppId, webAppSecret); @@ -254,22 +443,85 @@ public class SsoService { return appUser; } + /** + * 保存sysuser + * @param userJson + * @return + */ + private SysUser saveSysUser(JSONObject userJson, Long appUserId) { + JSONObject info = userJson.containsKey("info") ? userJson.getJSONObject("info") : null; + SysUser sysUser = new SysUser(); + sysUser.setAppUserId(appUserId); + sysUser.setUserId(userJson.getLong("userId")); + sysUser.setUserName(userJson.getString("userName")); + sysUser.setNickName(userJson.getString("nickName")); + sysUser.setEmail(userJson.getString("email")); + sysUser.setSex(userJson.getString("sex")); + sysUser.setStatus("0"); + sysUser.setDelFlag("0"); + String date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()); + sysUser.setCreateTime(date); + sysUser.setUpdateTime(date); + sysUser.setLoginDate(new Date()); + sysUser.setCreateBy("system"); + sysUser.setLoginIp(IpUtils.getIpAddr()); + + //获取身份证 + String personCardNo = info != null && info.containsKey("personCardNo") ? info.getString("personCardNo") : userJson.getString("idCardNo"); + + //解密处理 + if (StringUtils.isNotEmpty(personCardNo)) { + personCardNo = EncryptUtil.decryptByAppIdAndSecret(personCardNo, webAppId, webAppSecret); + sysUser.setIdCard(personCardNo); + } + String phone = info != null && info.containsKey("personPhone") ? info.getString("personPhone") : userJson.getString("phonenumber"); + //解密电话号码 + if (StringUtils.isNotEmpty(phone)) { + phone = EncryptUtil.decryptByAppIdAndSecret(phone, webAppId, webAppSecret); + sysUser.setPhonenumber(phone); + } + //部门 + if (userJson.containsKey("dept")) { + JSONObject dept = userJson.getJSONObject("dept"); + Long deptId = dept != null && dept.containsKey("deptId") ? dept.getLong("deptId") : null; + sysUser.setDeptId(deptId); + } + + sysUserService.insertUser(sysUser); + + //添加权限 + JSONArray roles = userJson.getJSONArray("roles"); + if (CollectionUtils.isNotEmpty(roles) && roles.size() != 0) { + List list = new ArrayList<>(); + for (int i=0; i claims = new HashMap<>(); claims.put(Constants.LOGIN_USER_KEY, token); + claims.put(Constants.LOGIN_USER_ID, String.valueOf(loginUser.getUserId())); + // 当前时间 + 30 分钟 + long currentTimeMillis = System.currentTimeMillis(); + long expireTimeMillis = currentTimeMillis + ((long) expireTime * 60 * 1000); // 30分钟 = 1800000 毫秒 + long expireTimeSeconds = expireTimeMillis / 1000; // 转换为秒(时间戳) + claims.put(Constants.EXP, expireTimeSeconds); return createToken(claims); } + /** + * 超时时间为2个小时 + * @param loginUser + * @return + */ + public String createTokenHourTwo(LoginUser loginUser) + { + String token = IdUtils.fastUUID(); + loginUser.setToken(token); + setUserAgent(loginUser); + //缓存2个小时 + refreshTokenTwoHour(loginUser); + + Map claims = new HashMap<>(); + claims.put(Constants.LOGIN_USER_KEY, token); + claims.put(Constants.LOGIN_USER_ID, String.valueOf(loginUser.getUserId())); + // 当前时间 + 120 分钟 + long currentTimeMillis = System.currentTimeMillis(); + long expireTimeMillis = currentTimeMillis + ((long) expireTime * 4 * 60 * 1000); // 12分钟 = 1800000 毫秒 + long expireTimeSeconds = expireTimeMillis / 1000; // 转换为秒(时间戳) + claims.put(Constants.EXP, expireTimeSeconds); + return createToken(claims); + } + + /** + * 缓存2个小时 + * @param loginUser + */ + public void refreshTokenTwoHour(LoginUser loginUser) + { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * 4 * MILLIS_MINUTE); + // 根据uuid将LoginSiteUser缓存 + String userKey = getTokenKey(loginUser.getToken(), String.valueOf(loginUser.getUserId())); + redisCache.setCacheObject(userKey, loginUser, 2, TimeUnit.HOURS); + } + /** * 验证令牌有效期,相差不足20分钟,自动刷新缓存 * @@ -149,7 +195,7 @@ public class TokenService loginUser.setLoginTime(System.currentTimeMillis()); loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); // 根据uuid将loginUser缓存 - String userKey = getTokenKey(loginUser.getToken()); + String userKey = getTokenKey(loginUser.getToken(), String.valueOf(loginUser.getUserId())); redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); } @@ -228,4 +274,9 @@ public class TokenService { return CacheConstants.LOGIN_TOKEN_KEY + uuid; } + + private String getTokenKey(String uuid, String userId) + { + return CacheConstants.LOGIN_TOKEN_KEY + userId + ":" + uuid; + } } diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 20f8db7..7e43a5a 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -170,6 +170,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_by, remark, id_card, + app_user_id, create_time )values( #{userId}, @@ -185,6 +186,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{createBy}, #{remark}, #{idCard}, + #{appUserId}, sysdate() )