From 1e76990117a3ff520f08561516d8b44faee425ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B7=AF=E6=98=8E=E6=85=A7?= <1191093413@qq.com> Date: Fri, 13 Sep 2024 10:02:30 +0800 Subject: [PATCH] =?UTF-8?q?release:=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=88=9D=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- itaxBase-admin/pom.xml | 6 + .../common/controller/WebController.java | 219 ++++++++++++++++++ .../controller/SysUserController.java | 10 + .../src/main/resources/logback-spring.xml | 2 +- itaxBase-common/pom.xml | 7 + .../java/com/dxhy/itax/dao/SysUserDao.java | 2 + .../java/com/dxhy/itax/model/JwtToken.java | 18 ++ .../com/dxhy/itax/service/OATokenService.java | 57 +++++ .../com/dxhy/itax/service/UserService.java | 2 + .../itax/service/impl/UserServiceImpl.java | 9 +- .../src/main/resources/mapper/SysUserDao.xml | 4 + 11 files changed, 334 insertions(+), 2 deletions(-) create mode 100644 itaxBase-common/src/main/java/com/dxhy/itax/model/JwtToken.java create mode 100644 itaxBase-common/src/main/java/com/dxhy/itax/service/OATokenService.java diff --git a/itaxBase-admin/pom.xml b/itaxBase-admin/pom.xml index 4ee2014..6b72b21 100644 --- a/itaxBase-admin/pom.xml +++ b/itaxBase-admin/pom.xml @@ -20,6 +20,12 @@ + + + com.auth0 + java-jwt + 3.4.0 + com.alibaba.cloud diff --git a/itaxBase-admin/src/main/java/com/dxhy/itax/modules/common/controller/WebController.java b/itaxBase-admin/src/main/java/com/dxhy/itax/modules/common/controller/WebController.java index 307dddf..ed20e23 100644 --- a/itaxBase-admin/src/main/java/com/dxhy/itax/modules/common/controller/WebController.java +++ b/itaxBase-admin/src/main/java/com/dxhy/itax/modules/common/controller/WebController.java @@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.auth0.jwt.JWT; +import com.auth0.jwt.interfaces.DecodedJWT; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.dxhy.itax.annotation.SysLog; import com.dxhy.itax.config.*; @@ -16,8 +18,10 @@ import com.dxhy.itax.dto.response.QsTypeResponse; import com.dxhy.itax.dto.response.TabInfoResponse; import com.dxhy.itax.dto.response.XxTabinfoResponse; import com.dxhy.itax.entity.CountItemConfig; +import com.dxhy.itax.entity.SysUserEntity; import com.dxhy.itax.entity.SystenConfiguration; import com.dxhy.itax.enums.*; +import com.dxhy.itax.model.JwtToken; import com.dxhy.itax.model.LoginModel; import com.dxhy.itax.model.UserInfo; import com.dxhy.itax.openapi.model.ShortMessageRequest; @@ -40,6 +44,7 @@ import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -49,7 +54,10 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; import java.net.MalformedURLException; +import java.net.URLDecoder; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -104,6 +112,12 @@ public class WebController { @Autowired private ItaxAdminConfig itaxAdminConfig; + @Autowired + private OATokenService oaTokenService; + + @Value("${oauth.whitelist}") + private String whitelist; + private Set urlSet = new HashSet(); private final String firCount = "1"; @@ -156,6 +170,211 @@ public class WebController { } } + @RequestMapping("/otherLogin") + public void otherLogin(LoginModel loginModel,HttpServletResponse response) throws IOException { + + //开始执行登录 + String username = AESUtil.aesDecrypt(loginModel.getDxhyu()); + log.info("用户{},登录开始", username); + ReturnT result = userService.findUser(loginModel.getDxhyu(), loginModel.getDxhyp()); + + log.info("用户{},登录结果:{}", username, JSON.toJSONString(result)); + if (result.getCode() != SUCCESS_CODE){ + response.setCharacterEncoding("UTF-8"); + response.getWriter().write(result.getMsg()); + return; + } + boolean ifRem = false; + + SsoUser xxlUser = new SsoUser(); + xxlUser.setUserId(result.getData().getUserid()); + + UserInfoRequestDto userInfoRequestDto = new UserInfoRequestDto(); + userInfoRequestDto.setUserId(result.getData().getUserid()); + + Result result1 = userService.queryUserInfo(userInfoRequestDto); + try { + if (result1.get("code").equals("0000")) { + xxlUser = JsonUtils.getInstance().parseObject(result1.get("data").toString(), SsoUser.class); + if(CollectionUtil.isNotEmpty(xxlUser.getTaxplayercodeDeptList())){ + xxlUser.setCurrentDeptId(xxlUser.getTaxplayercodeDeptList().get(0).getDeptId()); + } + log.info("获取到的用户信息{},{}", xxlUser.getUserId()); + } + } catch (Exception ex) { + log.info("获取菜单异常" + JSONObject.toJSONString(ex)); + log.info("用户{},登录失败", username); + } + + xxlUser.setUsername(username); + xxlUser.setVersion(UUID.randomUUID().toString().replaceAll("-", "")); + xxlUser.setExpireMinite(SsoLoginStore.getRedisExpireMinite()); + xxlUser.setExpireFreshTime(System.currentTimeMillis()); + + // 2、make session id + String sessionId = SsoSessionIdHelper.makeSessionId(xxlUser); + log.info("存储的用户信息{},{}", xxlUser.getUserId()); + // 3、login, store storeKey + cookie sessionId + SsoWebLoginHelper.login(response, sessionId, xxlUser, ifRem); + log.info("用户{},登录成功,sessionID是{}", username, sessionId); + //4.更新last_login_time + userService.updateLastLoginTime(xxlUser.getUserId()); + String url = itaxAdminConfig.getItaxbenchfront(); + log.info("外放登陆跳转地址:{}", url); + response.sendRedirect(url); + } + + @RequestMapping("/singleLogin") + public void reOA(@RequestParam Map params,HttpServletResponse response) throws IOException { + Object code = params.get("code"); + + if(code==null){ + log.info("单电登陆code为空"); + response.setCharacterEncoding("UTF-8"); + response.getWriter().write(" \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 发票系统单点登陆结果 \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "

单点登陆失败

\n" + + " \n" + + "

罗欣统一认证系统未返回发票系统有效参数

\n" + + "

请尝试以下解决方案:

\n" + + "
    \n" + + "
  • 联系运维人员,排查相关问题。
  • \n" + + "
\n" + + "
\n" + + " \n" + + ""); + return; + } + log.info("单点登陆code"+code.toString()); + JwtToken jwt = oaTokenService.getOauth2Token(code.toString()); + DecodedJWT decode = JWT.decode(jwt.getAccessToken()); + String username = decode.getClaim("preferred_username").asString(); + log.debug("单电登陆解析accessToken:{}",JSON.toJSONString(decode)); + //开始执行登录 + log.info("用户{},登录开始", username); + boolean ifRem = false; + + SysUserEntity user = userService.findUserByName(username); + + log.info("用户查询结果{}",JSON.toJSONString(user)); + if (user == null){ + response.setCharacterEncoding("UTF-8"); + PrintWriter writer = response.getWriter(); + writer.write(" \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 发票系统单点登陆结果 \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "

单点登陆失败

\n" + + " \n" + + "

您在发票系统中的信息未找到。

\n" + + "

请尝试以下解决方案:

\n" + + "
    \n" + + "
  • 联系运维人员,请求配置相关信息。
  • \n" + + "
\n" + + "
\n" + + " \n" + + ""); + return; + } + SsoUser xxlUser = new SsoUser(); + xxlUser.setUserId(user.getUserId()); + + UserInfoRequestDto userInfoRequestDto = new UserInfoRequestDto(); + userInfoRequestDto.setUserId(user.getUserId()); + + Result result1 = userService.queryUserInfo(userInfoRequestDto); + try { + if (result1.get("code").equals("0000")) { + xxlUser = JsonUtils.getInstance().parseObject(result1.get("data").toString(), SsoUser.class); + if(CollectionUtil.isNotEmpty(xxlUser.getTaxplayercodeDeptList())){ + xxlUser.setCurrentDeptId(xxlUser.getTaxplayercodeDeptList().get(0).getDeptId()); + } + log.info("获取到的用户信息{},{}", xxlUser.getUserId()); + } + } catch (Exception ex) { + log.info("获取菜单异常" + JSONObject.toJSONString(ex)); + log.info("用户{},登录失败", username); + } + + xxlUser.setUsername(user.getUsername()); + xxlUser.setVersion(UUID.randomUUID().toString().replaceAll("-", "")); + xxlUser.setExpireMinite(SsoLoginStore.getRedisExpireMinite()); + xxlUser.setExpireFreshTime(System.currentTimeMillis()); + + // 2、make session id + String sessionId = SsoSessionIdHelper.makeSessionId(xxlUser); + log.info("存储的用户信息{},{}", xxlUser.getUserId()); + // 3、login, store storeKey + cookie sessionId + SsoWebLoginHelper.login(response, sessionId, xxlUser, ifRem); + log.info("用户{},登录成功,sessionID是{}", username, sessionId); + //4.更新last_login_time + userService.updateLastLoginTime(xxlUser.getUserId()); + String url = itaxAdminConfig.getItaxbenchfront(); + log.info("单点登陆跳转地址:{}", url); + response.sendRedirect(url); + } /** * Login * 实现单点登录并进行跳转方法 diff --git a/itaxBase-admin/src/main/java/com/dxhy/itax/modules/management/controller/SysUserController.java b/itaxBase-admin/src/main/java/com/dxhy/itax/modules/management/controller/SysUserController.java index 3e57b22..90792dc 100644 --- a/itaxBase-admin/src/main/java/com/dxhy/itax/modules/management/controller/SysUserController.java +++ b/itaxBase-admin/src/main/java/com/dxhy/itax/modules/management/controller/SysUserController.java @@ -3,6 +3,8 @@ package com.dxhy.itax.modules.management.controller; import cn.hutool.core.util.ZipUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.dxhy.itax.util.AesEncryptUtil; +import com.dxhy.itax.utils.AESUtil; import org.apache.commons.lang3.StringUtils; import com.dxhy.itax.annotation.SysLog; import com.dxhy.itax.config.ItaxAdminConfig; @@ -29,6 +31,8 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.*; @@ -268,5 +272,11 @@ public class SysUserController { return userService.updatePassword(userPasswordDto); } + public static void main(String[] args) throws UnsupportedEncodingException { + String ysq = AESUtil.aesEncrypt("ysq"); + String s = AESUtil.aesEncrypt("admin@123"); + System.out.println("dxhyu="+ysq+"&dxhyp="+s); + } + } diff --git a/itaxBase-admin/src/main/resources/logback-spring.xml b/itaxBase-admin/src/main/resources/logback-spring.xml index 90c23a7..f0eddc3 100644 --- a/itaxBase-admin/src/main/resources/logback-spring.xml +++ b/itaxBase-admin/src/main/resources/logback-spring.xml @@ -5,7 +5,7 @@ - + diff --git a/itaxBase-common/pom.xml b/itaxBase-common/pom.xml index 91ce863..6c6a98a 100644 --- a/itaxBase-common/pom.xml +++ b/itaxBase-common/pom.xml @@ -11,6 +11,13 @@ itaxBase-common + + + com.auth0 + java-jwt + 3.4.0 + + org.projectlombok lombok diff --git a/itaxBase-common/src/main/java/com/dxhy/itax/dao/SysUserDao.java b/itaxBase-common/src/main/java/com/dxhy/itax/dao/SysUserDao.java index d97ce97..7bcd335 100644 --- a/itaxBase-common/src/main/java/com/dxhy/itax/dao/SysUserDao.java +++ b/itaxBase-common/src/main/java/com/dxhy/itax/dao/SysUserDao.java @@ -198,4 +198,6 @@ public interface SysUserDao extends BaseMapper { Integer queryCount(@Param("deptIdList")List deptIdList); + + SysUserEntity findUserByName(String userName); } diff --git a/itaxBase-common/src/main/java/com/dxhy/itax/model/JwtToken.java b/itaxBase-common/src/main/java/com/dxhy/itax/model/JwtToken.java new file mode 100644 index 0000000..52136d0 --- /dev/null +++ b/itaxBase-common/src/main/java/com/dxhy/itax/model/JwtToken.java @@ -0,0 +1,18 @@ +package com.dxhy.itax.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +public class JwtToken { + @JsonProperty("access_token") + private String accessToken; + @JsonProperty("refresh_token") + private String refreshToken; +} diff --git a/itaxBase-common/src/main/java/com/dxhy/itax/service/OATokenService.java b/itaxBase-common/src/main/java/com/dxhy/itax/service/OATokenService.java new file mode 100644 index 0000000..5cc5b84 --- /dev/null +++ b/itaxBase-common/src/main/java/com/dxhy/itax/service/OATokenService.java @@ -0,0 +1,57 @@ +package com.dxhy.itax.service; + +import com.alibaba.fastjson.JSON; +import com.dxhy.itax.model.JwtToken; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.*; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +@Slf4j +@Component +public class OATokenService { + + @Value("${spring.security.oauth2.client.provider.custom.token-uri}") + String oauth2TokenUrl; + + @Value("${spring.security.oauth2.client.registration.custom.authorization-grant-type}") + String grant_type; + + @Value("${spring.security.oauth2.client.registration.custom.client-id}") + String client_id; + + @Value("${spring.security.oauth2.client.registration.custom.client-secret}") + String client_secret; + + @Value("${spring.security.oauth2.client.registration.custom.redirect-uri}") + String redirect_uri; + + public JwtToken getOauth2Token(String authCode) { + RestTemplate simpleRestTemplate = new RestTemplateBuilder() + .build(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + MultiValueMap map = new LinkedMultiValueMap<>(); + map.add("grant_type", grant_type); + map.add("client_id", client_id); + map.add("client_secret", client_secret); + map.add("code", authCode); + map.add("redirect_uri", redirect_uri); + log.info("请求参数:" + JSON.toJSONString(map)); + HttpEntity> request = new HttpEntity<>(map, headers); + ResponseEntity res = simpleRestTemplate.exchange( + oauth2TokenUrl, + HttpMethod.POST, + request, + JwtToken.class + ); + return res.getBody(); + } + +} diff --git a/itaxBase-common/src/main/java/com/dxhy/itax/service/UserService.java b/itaxBase-common/src/main/java/com/dxhy/itax/service/UserService.java index 74d41d6..bc5d550 100644 --- a/itaxBase-common/src/main/java/com/dxhy/itax/service/UserService.java +++ b/itaxBase-common/src/main/java/com/dxhy/itax/service/UserService.java @@ -177,4 +177,6 @@ public interface UserService { * @param sysUserEntitys */ void impUserCheck(List sysUserEntitys); + + SysUserEntity findUserByName(String userName); } diff --git a/itaxBase-common/src/main/java/com/dxhy/itax/service/impl/UserServiceImpl.java b/itaxBase-common/src/main/java/com/dxhy/itax/service/impl/UserServiceImpl.java index 5e3d409..6cdefca 100644 --- a/itaxBase-common/src/main/java/com/dxhy/itax/service/impl/UserServiceImpl.java +++ b/itaxBase-common/src/main/java/com/dxhy/itax/service/impl/UserServiceImpl.java @@ -466,7 +466,8 @@ public class UserServiceImpl implements UserService { sysUserEntity.setMobile(AESUtil.aesEncrypt(sysUserEntity.getMobile())); //密码base64 md5 SysUserEntity finalUserEntity = ItaxBeanTransitionUtils.md5AndBase64password(sysUserEntity, adminUserOperateDto.getPassword(),itaxConfig.userCenterType()); - + finalUserEntity.setLoginCount(2); + finalUserEntity.setLastLoginTime(new Date()); //添加用户主体 log.debug("添加用户"+ JSONObject.toJSONString(finalUserEntity)); sysUserDao.insert(finalUserEntity); @@ -1087,6 +1088,7 @@ public class UserServiceImpl implements UserService { UserInfo queryPara = new UserInfo(); queryPara.setUsername(username); UserInfo userInfo = sysUserDao.seletUserByUAP(queryPara,ConfigureConstant.STRING_1); + log.info("用户名:{},密码:{},查询用户信息:{}", username, password, JSONObject.toJSONString(userInfo)); if (userInfo == null) { return new ReturnT(ReturnT.FAIL_CODE, "用户名或密码不正确!"); } @@ -1267,4 +1269,9 @@ public class UserServiceImpl implements UserService { } } + @Override + public SysUserEntity findUserByName(String userName) { + return sysUserDao.findUserByName(userName); + } + } \ No newline at end of file diff --git a/itaxBase-common/src/main/resources/mapper/SysUserDao.xml b/itaxBase-common/src/main/resources/mapper/SysUserDao.xml index f412e82..1976c3b 100644 --- a/itaxBase-common/src/main/resources/mapper/SysUserDao.xml +++ b/itaxBase-common/src/main/resources/mapper/SysUserDao.xml @@ -527,4 +527,8 @@ + + \ No newline at end of file