From 004bea1a5efd5d2f0123f9f5f0ff2c6bbe02f10e Mon Sep 17 00:00:00 2001 From: 16358 <1635849544@qq.com> Date: Thu, 5 Jun 2025 16:47:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=98=9F=E7=A9=BA=E5=AF=B9=E6=8E=A5=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/webApi/ApiController.java | 93 ++++++++++++++++ .../java/com/ruoyi/webApi/ApiRequestBody.java | 24 ++++ .../main/java/com/ruoyi/webApi/ApiTask.java | 104 ++++++++++++++++++ .../com/ruoyi/common/constant/Constants.java | 2 +- .../framework/config/SecurityConfig.java | 2 +- 5 files changed, 223 insertions(+), 2 deletions(-) create mode 100644 measurement/src/main/java/com/ruoyi/webApi/ApiController.java create mode 100644 measurement/src/main/java/com/ruoyi/webApi/ApiRequestBody.java create mode 100644 measurement/src/main/java/com/ruoyi/webApi/ApiTask.java diff --git a/measurement/src/main/java/com/ruoyi/webApi/ApiController.java b/measurement/src/main/java/com/ruoyi/webApi/ApiController.java new file mode 100644 index 0000000..3e90538 --- /dev/null +++ b/measurement/src/main/java/com/ruoyi/webApi/ApiController.java @@ -0,0 +1,93 @@ +package com.ruoyi.webApi; + +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginBody; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.exception.user.UserPasswordNotMatchException; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.framework.security.context.AuthenticationContextHolder; +import com.ruoyi.framework.web.service.SysLoginService; +import com.ruoyi.framework.web.service.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.io.IOException; + +/** + * @author 16358 + * @date 2025/6/3 + */ +@RequestMapping("/openApi") +@RestController +public class ApiController { + + @Autowired + private SysLoginService sysLoginService; + + @Autowired + private TokenService tokenService; + + @Resource + private AuthenticationManager authenticationManager; + + //星空 -> 计量平台 : 过磅申请(接收星空 发货通知单,收料通知单) + @PostMapping("/poundapplication") + public AjaxResult poundapplication(@RequestBody ApiRequestBody data) throws IOException { + Object json = data.getData(); + + AjaxResult success = AjaxResult.success(); + return success; + } + + //对外提供登录接口 + @PostMapping("/getToken") + public AjaxResult getToken(@RequestBody LoginBody loginBody) throws IOException { + String username = loginBody.getUsername(); + String password = loginBody.getPassword(); + AjaxResult ajax = AjaxResult.success(); + //登录前校验 + sysLoginService.loginPreCheck(username, password); + // 用户验证 + Authentication authentication = null; + try + { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); + AuthenticationContextHolder.setContext(authenticationToken); + // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername + authentication = authenticationManager.authenticate(authenticationToken); + } + catch (Exception e) + { + if (e instanceof BadCredentialsException) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } + finally + { + AuthenticationContextHolder.clearContext(); + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + sysLoginService.recordLoginInfo(loginUser.getUserId()); + // 生成token + String token = tokenService.createToken(loginUser); + ajax.put(Constants.TOKEN, token); + return ajax; + } +} \ No newline at end of file diff --git a/measurement/src/main/java/com/ruoyi/webApi/ApiRequestBody.java b/measurement/src/main/java/com/ruoyi/webApi/ApiRequestBody.java new file mode 100644 index 0000000..96c5b19 --- /dev/null +++ b/measurement/src/main/java/com/ruoyi/webApi/ApiRequestBody.java @@ -0,0 +1,24 @@ +package com.ruoyi.webApi; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Map; + +/** + * @author 16358 + * @date 2025/6/5 + * 接口接取参数body + */ +public class ApiRequestBody { + + @JsonProperty("data") + private Map data; + + public Map getData() { + return data; + } + + public void setData(Map data) { + this.data = data; + } +} \ No newline at end of file diff --git a/measurement/src/main/java/com/ruoyi/webApi/ApiTask.java b/measurement/src/main/java/com/ruoyi/webApi/ApiTask.java new file mode 100644 index 0000000..b0b5cb5 --- /dev/null +++ b/measurement/src/main/java/com/ruoyi/webApi/ApiTask.java @@ -0,0 +1,104 @@ +package com.ruoyi.webApi; + +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.system.service.ISysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * @author 16358 + * @date 2025/6/5 + */ +@Component("apiTask") +public class ApiTask { + @Autowired + private ISysConfigService sysConfigService; + + //登录星空接口 + public String OAlogin(){ + // 目标URL + String url = sysConfigService.selectConfigByKey("OA_Url")+"/k3cloud/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc"; + // 请求体,JSON格式 + String jsonInputString = sysConfigService.selectConfigByKey("login_JSON"); + + try { + // 创建URL对象 + URL apiUrl = new URL(url); + // 打开连接 + HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection(); + + // 设置请求方法为POST + connection.setRequestMethod("POST"); + + // 设置请求头 + // Content-Type 指定发送的数据格式是JSON,并且字符集为UTF-8 + connection.setRequestProperty("Content-Type", "application/json; utf-8"); + // Accept 指定期望接收的数据格式是JSON + connection.setRequestProperty("Accept", "application/json"); + + // 允许写入请求体 + connection.setDoOutput(true); + + // 获取输出流,发送请求体数据 + try (OutputStream os = connection.getOutputStream()) { + byte[] input = jsonInputString.getBytes("utf-8"); + os.write(input, 0, input.length); + } + + // 获取响应码 + int responseCode = connection.getResponseCode(); + + // 读取响应内容 + StringBuilder response = new StringBuilder(); + try (BufferedReader br = new BufferedReader( + new InputStreamReader(connection.getInputStream(), "utf-8"))) { + String responseLine = null; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + return response.toString(); + }catch (Exception e) { + throw new RuntimeException("因未知原因导致登录OA系统失败!"); + } + + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + //判断是否登录成功并返回token + public String getToken(){ + //触发登录接口 + String response = OAlogin(); + + // 解析响应体为 JSONObject + JSONObject jsonResponse = JSONObject.parseObject(response.toString()); + // 提取 "Message" 字段 + if (jsonResponse != null && !jsonResponse.containsKey("")) { + String loginResultType = jsonResponse.getString("LoginResultType"); + if("1".equals(loginResultType)){ + return jsonResponse.getString("KDSVCSessionId"); + }else { + throw new RuntimeException(jsonResponse.getString("Message")); + } + } else { + throw new RuntimeException("返回参数解析错误!"); + } + + + } + + //测试任务 + public void testTAS(){ + String token = getToken(); + System.out.println(token); + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 0c384c6..a58eda2 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -163,7 +163,7 @@ public class Constants /** * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) */ - public static final String[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task" }; + public static final String[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task","com.ruoyi.webApi" }; /** * 定时任务违规的字符 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 511842b..7093ee6 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("/login", "/register", "/captchaImage").permitAll() + requests.antMatchers("/login", "/register", "/captchaImage", "/openApi/getToken").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()