From 463cf470666556277fd3ca9a0d2c852581af216c Mon Sep 17 00:00:00 2001 From: lroyia Date: Mon, 12 Jan 2026 17:16:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=90=8A=E9=94=80=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=AF=B9=E5=A4=96=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PenaltySecurityController.java | 134 ++++++++++++++++++ .../aiccs/security/entity/PenaltyAppInfo.java | 48 +++++++ .../entity/dto/LoginInfoParamDto.java | 33 +++++ .../entity/dto/PenaltyCaseInfoEntInfoDto.java | 51 +++++++ .../entity/dto/PenaltyCaseInfoRequestDto.java | 78 ++++++++++ .../aiccs/security/entity/vo/ErrorInfoVO.java | 29 ++++ .../security/entity/vo/SecurityResultVO.java | 61 ++++++++ .../aiccs/aiccs/security/enums/ErrorCode.java | 36 +++++ .../security/mapper/PenaltyAppInfoMapper.java | 13 ++ .../service/IPenaltyAppInfoService.java | 46 ++++++ .../impl/PenaltyAppInfoServiceImpl.java | 68 +++++++++ .../chinaweal/aiccs/config/ShiroConfig.java | 1 + .../aiccs/security/PenaltyAppInfoMapper.xml | 6 + 13 files changed, 604 insertions(+) create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/controller/PenaltySecurityController.java create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/entity/PenaltyAppInfo.java create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/LoginInfoParamDto.java create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/PenaltyCaseInfoEntInfoDto.java create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/PenaltyCaseInfoRequestDto.java create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/entity/vo/ErrorInfoVO.java create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/entity/vo/SecurityResultVO.java create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/enums/ErrorCode.java create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/mapper/PenaltyAppInfoMapper.java create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/service/IPenaltyAppInfoService.java create mode 100644 src/main/java/com/chinaweal/aiccs/aiccs/security/service/impl/PenaltyAppInfoServiceImpl.java create mode 100644 src/main/resources/mybatis/mapper/aiccs/security/PenaltyAppInfoMapper.xml diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/controller/PenaltySecurityController.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/controller/PenaltySecurityController.java new file mode 100644 index 0000000..eba2025 --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/controller/PenaltySecurityController.java @@ -0,0 +1,134 @@ +package com.chinaweal.aiccs.aiccs.security.controller; + +import com.alibaba.fastjson.JSONObject; +import com.chinaweal.aiccs.aiccs.security.entity.PenaltyAppInfo; +import com.chinaweal.aiccs.aiccs.security.entity.dto.LoginInfoParamDto; +import com.chinaweal.aiccs.aiccs.security.entity.dto.PenaltyCaseInfoRequestDto; +import com.chinaweal.aiccs.aiccs.security.entity.vo.SecurityResultVO; +import com.chinaweal.aiccs.aiccs.security.enums.ErrorCode; +import com.chinaweal.aiccs.aiccs.security.service.IPenaltyAppInfoService; +import com.chinaweal.aiccs.common.constant.Constant; +import com.chinaweal.aiccs.common.util.StringUtils; +import com.chinaweal.aiccs.org.entity.TUsers; +import com.chinaweal.aiccs.org.service.TUsersService; +import com.chinaweal.aicorg.exception.CryptException; +import com.chinaweal.aicorg.util.PasswordVerify; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 批量吊销对外接口 + * + * @author lroyia + * @since 2026/1/12 15:46 + **/ +@Slf4j +@RestController +@RequestMapping("/security") +public class PenaltySecurityController { + + @Autowired + private TUsersService tUsersService; + @Autowired + private IPenaltyAppInfoService penaltyAppInfoService; + + /** + * 登录 + * + * @param paramDto 登录参数 + * @return 登录结果 + */ + @PostMapping("/login") + public Object login(@RequestBody LoginInfoParamDto paramDto) { + String appKey = paramDto.getAppKey(); + String appSecret = paramDto.getAppSecret(); + if (StringUtils.isBlank(appKey)) { + return SecurityResultVO.error(ErrorCode.APP_KEY_INVALID); + } + if (StringUtils.isBlank(appSecret)) { + return SecurityResultVO.error(ErrorCode.APP_SECRET_INVALID); + } + PenaltyAppInfo byId = penaltyAppInfoService.getById(appKey); + if (byId == null) { + return SecurityResultVO.error(ErrorCode.APP_KEY_INVALID); + } + if (StringUtils.notEquals(byId.getAppSecret(), appSecret)) { + return SecurityResultVO.error(ErrorCode.APP_SECRET_INVALID); + } + if (StringUtils.isBlank(paramDto.getAccount()) || StringUtils.isBlank(paramDto.getPassword())) { + return SecurityResultVO.error(ErrorCode.LOGIN_INFO_INVALID); + } + TUsers one = tUsersService.lambdaQuery().eq(TUsers::getUsername, paramDto.getAccount()) + .eq(TUsers::getDeleted, Constant.FALSE_0_STR).eq(TUsers::getLocked, Constant.FALSE_0_STR).last("limit 1").one(); + if (one == null) { + return SecurityResultVO.error(ErrorCode.LOGIN_INFO_INVALID); + } + + try { + if (StringUtils.notEquals(PasswordVerify.DecodePassword(one.getPassword()), paramDto.getPassword())) { + return SecurityResultVO.error(ErrorCode.LOGIN_INFO_INVALID); + } + } catch (CryptException e) { + log.error("用户密码解密失败", e); + return SecurityResultVO.error(ErrorCode.LOGIN_INFO_INVALID); + } + JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(SecurityResultVO.success())); + jsonObject.put("access_token", penaltyAppInfoService.generateAccessToken(byId, one)); + return jsonObject; + } + + /** + * 登出 + * + * @param accessToken accessToken + * @return 操作结果 + */ + @PostMapping("/logout") + public SecurityResultVO logout(@RequestParam("access_token") String accessToken) { + penaltyAppInfoService.removeAccessToken(accessToken); + return SecurityResultVO.success(); + } + + /** + * 批量吊销对外接口 + * + * @param requestDto 请求参数 + * @return 请求结果 + */ + @PostMapping("receiveCaseInfo") + public SecurityResultVO receiveCaseInfo(@RequestParam("access_token") String accessToken, + @RequestBody PenaltyCaseInfoRequestDto requestDto) { + if (!penaltyAppInfoService.existsAccessToken(accessToken)) { + return SecurityResultVO.error(ErrorCode.ACCESS_TOKEN_INVALID); + } + if (StringUtils.isBlank(requestDto.getCaseid())) { + return SecurityResultVO.error(ErrorCode.PARAM_VALID_FAIL_0); + } + if (StringUtils.isBlank(requestDto.getCasename())) { + return SecurityResultVO.error(ErrorCode.PARAM_VALID_FAIL_1); + } + if (StringUtils.isBlank(requestDto.getCaseintroduction())) { + return SecurityResultVO.error(ErrorCode.PARAM_VALID_FAIL_2); + } + if (StringUtils.isBlank(requestDto.getIllegality())) { + return SecurityResultVO.error(ErrorCode.PARAM_VALID_FAIL_3); + } + if (StringUtils.isBlank(requestDto.getPenalty())) { + return SecurityResultVO.error(ErrorCode.PARAM_VALID_FAIL_4); + } + if (StringUtils.isBlank(requestDto.getPenaltydate())) { + return SecurityResultVO.error(ErrorCode.PARAM_VALID_FAIL_5); + } + if (StringUtils.isBlank(requestDto.getPenaltyorg())) { + return SecurityResultVO.error(ErrorCode.PARAM_VALID_FAIL_6); + } + if (CollectionUtils.isNotEmpty(requestDto.getPenaltylist())) { + return SecurityResultVO.error(ErrorCode.PARAM_VALID_FAIL_7); + } + + // TODO: 接收业务处理 + return SecurityResultVO.success(); + } +} diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/PenaltyAppInfo.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/PenaltyAppInfo.java new file mode 100644 index 0000000..15eb8ba --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/PenaltyAppInfo.java @@ -0,0 +1,48 @@ +package com.chinaweal.aiccs.aiccs.security.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 批量吊销外部应用接入信息 + * + * @author lroyia + * @since 2026/1/12 16:25 + **/ +@Data +@Accessors(chain = true) +@TableName("PENALTY_APP_INFO") +@ApiModel("批量吊销外部应用接入信息") +public class PenaltyAppInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * APP的key + */ + @ApiModelProperty("APP的key") + @TableId(value = "APP_KEY", type = IdType.ASSIGN_UUID) + private String appKey; + + /** + * APP访问秘钥 + */ + @ApiModelProperty("APP访问秘钥") + @TableField("APP_SECRET") + private String appSecret; + + /** + * 外部应用接入描述 + */ + @ApiModelProperty("外部应用接入描述") + @TableField("APP_DESCRIPTION") + private String appDescription; +} diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/LoginInfoParamDto.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/LoginInfoParamDto.java new file mode 100644 index 0000000..d5532d6 --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/LoginInfoParamDto.java @@ -0,0 +1,33 @@ +package com.chinaweal.aiccs.aiccs.security.entity.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 批量吊销对外登录信息参数 + * + * @author lroyia + * @since 2026/1/12 15:43 + **/ +@Data +@Accessors(chain = true) +public class LoginInfoParamDto implements Serializable { + + private static final long serialVersionUID = 1L; + + @JSONField(name = "app_key") + private String appKey; + + @JSONField(name = "app_secret") + private String appSecret; + + @JSONField(name = "account") + private String account; + + @JSONField(name = "password") + private String password; +} diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/PenaltyCaseInfoEntInfoDto.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/PenaltyCaseInfoEntInfoDto.java new file mode 100644 index 0000000..72ec783 --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/PenaltyCaseInfoEntInfoDto.java @@ -0,0 +1,51 @@ +package com.chinaweal.aiccs.aiccs.security.entity.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 市场主体信息 + * + * @author lroyia + * @since 2026/1/12 17:13 + **/ +@Data +@Accessors(chain = true) +@ApiModel(value = "市场主体信息") +public class PenaltyCaseInfoEntInfoDto implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 市场主体身份代码 + */ + @JSONField(name = "pripid") + @ApiModelProperty("市场主体身份代码") + private String pripid; + + /** + * 统一社会信用代码 + */ + @JSONField(name = "uniscid") + @ApiModelProperty("统一社会信用代码") + private String uniscid; + + /** + * 法定代表人(负责人) + */ + @JSONField(name = "legal") + @ApiModelProperty("法定代表人(负责人)") + private String legal; + + /** + * 市场主体类型 + */ + @JSONField(name = "enttype") + @ApiModelProperty("市场主体类型") + private String enttype; +} diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/PenaltyCaseInfoRequestDto.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/PenaltyCaseInfoRequestDto.java new file mode 100644 index 0000000..391997f --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/dto/PenaltyCaseInfoRequestDto.java @@ -0,0 +1,78 @@ +package com.chinaweal.aiccs.aiccs.security.entity.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * + * @author lroyia + * @since 2026/1/12 16:56 + **/ +@Data +@Accessors(chain = true) +@ApiModel("批量吊销接口请求参数") +public class PenaltyCaseInfoRequestDto implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 案件编号 + */ + @ApiModelProperty("案件编号") + @JSONField(name = "caseid") + private String caseid; + + /** + * 案件名称 + */ + @JSONField(name = "casename") + @ApiModelProperty("案件名称") + private String casename; + + /** + * 案由 + */ + @ApiModelProperty("案由") + @JSONField(name = "caseintroduction") + private String caseintroduction; + + /** + * 违法行为 + */ + @ApiModelProperty("违法行为") + @JSONField(name = "illegality") + private String illegality; + + /** + * 处罚内容 + */ + @JSONField(name = "penalty") + @ApiModelProperty("处罚内容") + private String penalty; + + /** + * 处罚决定日期,yyyy-MM-dd + */ + @JSONField(name = "penaltydate") + @ApiModelProperty("处罚决定日期,yyyy-MM-dd") + private String penaltydate; + + /** + * 处罚决定机关 + */ + @JSONField(name = "penaltyorg") + @ApiModelProperty("处罚决定机关") + private String penaltyorg; + + /** + * 吊销市场主体清单 + */ + @JSONField(name = "penaltylist") + @ApiModelProperty("吊销市场主体清单") + private List penaltylist; +} diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/vo/ErrorInfoVO.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/vo/ErrorInfoVO.java new file mode 100644 index 0000000..c7cde01 --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/vo/ErrorInfoVO.java @@ -0,0 +1,29 @@ +package com.chinaweal.aiccs.aiccs.security.entity.vo; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 错误信息VO + * + * @author lroyia + * @since 2026/1/12 15:49 + **/ +@Data +@Accessors(chain = true) +public class ErrorInfoVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @JSONField(name = "error_code") + private String errorCode; + + @JSONField(name = "name") + private String name; + + @JSONField(name = "message") + private String message; +} diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/vo/SecurityResultVO.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/vo/SecurityResultVO.java new file mode 100644 index 0000000..dd7ca18 --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/entity/vo/SecurityResultVO.java @@ -0,0 +1,61 @@ +package com.chinaweal.aiccs.aiccs.security.entity.vo; + +import com.alibaba.fastjson.annotation.JSONField; +import com.chinaweal.aiccs.aiccs.security.enums.ErrorCode; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 批量报销板块的ResultVO + * + * @author lroyia + * @since 2026/1/12 15:48 + **/ +@Data +@Accessors(chain = true) +public class SecurityResultVO implements Serializable { + + private static final long serialVersionUID = 1L; + + private static final String SUCCESS = "SUCCESS"; + private static final String FAILURE = "FAILURE"; + + @JSONField(name = "ack_code") + private String ackCode; + + @JSONField(name = "errors") + private List errors; + + /** + * 创建请求成功信息 + * + * @return 成功 + */ + public static SecurityResultVO success() { + SecurityResultVO resultVO = new SecurityResultVO(); + resultVO.setAckCode(SUCCESS); + resultVO.errors = new ArrayList<>(0); + return resultVO; + } + + /** + * 创建失败返回信息 + * + * @return 成功 + */ + public static SecurityResultVO error(ErrorCode... codes) { + SecurityResultVO resultVO = new SecurityResultVO(); + resultVO.setAckCode(SUCCESS); + resultVO.errors = new ArrayList<>(codes == null ? 0 : codes.length); + if (codes != null) { + for (ErrorCode code : codes) { + resultVO.errors.add(new ErrorInfoVO().setErrorCode(code.getCode()).setName(code.getName()).setMessage(code.getMessage())); + } + } + return resultVO; + } +} diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/enums/ErrorCode.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/enums/ErrorCode.java new file mode 100644 index 0000000..15c1447 --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/enums/ErrorCode.java @@ -0,0 +1,36 @@ +package com.chinaweal.aiccs.aiccs.security.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 错误码枚举 + * @author lroyia + * @since 2026/1/12 15:51 + **/ +@Getter +@AllArgsConstructor +public enum ErrorCode { + + APP_KEY_INVALID("12002", "接口登录失败", "app_key无效"), + APP_SECRET_INVALID("12003", "接口登录失败", "app_secret无效"), + + LOGIN_INFO_INVALID("12004", "接口登录失败", "登录信息无效"), + + ACCESS_TOKEN_INVALID("13000", "accessToken校验", "ACCESS_TOKEN无效"), + PARAM_VALID_FAIL_0("14000", "参数校验失败", "案件编号不能为空"), + PARAM_VALID_FAIL_1("14001", "参数校验失败", "案件名称不能为空"), + PARAM_VALID_FAIL_2("14002", "参数校验失败", "案由不能为空"), + PARAM_VALID_FAIL_3("14003", "参数校验失败", "违法行为不能为空"), + PARAM_VALID_FAIL_4("14004", "参数校验失败", "处罚内容不能为空"), + PARAM_VALID_FAIL_5("14005", "参数校验失败", "处罚决定日期不能为空"), + PARAM_VALID_FAIL_6("14006", "参数校验失败", "处罚决定机关不能为空"), + PARAM_VALID_FAIL_7("14007", "参数校验失败", "吊销市场主体清单不能为空"), + ; + + private final String code; + + private final String name; + + private final String message; +} diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/mapper/PenaltyAppInfoMapper.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/mapper/PenaltyAppInfoMapper.java new file mode 100644 index 0000000..fd17eba --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/mapper/PenaltyAppInfoMapper.java @@ -0,0 +1,13 @@ +package com.chinaweal.aiccs.aiccs.security.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.chinaweal.aiccs.aiccs.security.entity.PenaltyAppInfo; + +/** + * 批量吊销外部应用接入信息 Mapper + * + * @author lroyia + * @since 2026/1/12 16:29 + **/ +public interface PenaltyAppInfoMapper extends BaseMapper { +} diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/service/IPenaltyAppInfoService.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/service/IPenaltyAppInfoService.java new file mode 100644 index 0000000..8e0c8ca --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/service/IPenaltyAppInfoService.java @@ -0,0 +1,46 @@ +package com.chinaweal.aiccs.aiccs.security.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.chinaweal.aiccs.aiccs.security.entity.PenaltyAppInfo; +import com.chinaweal.aiccs.org.entity.TUsers; + +/** + * 批量吊销外部应用接入信息 Service + * + * @author lroyia + * @since 2026/1/12 16:30 + **/ +public interface IPenaltyAppInfoService extends IService { + + /** + * 获取用户信息 + * + * @param accessToken 当前登录的accessToken + * @return 用户信息 + */ + TUsers getUserInfo(String accessToken); + + /** + * 生成AccessToken + * + * @param appInfo 应用信息 + * @param user 用户信息 + * @return 生成结果 + */ + String generateAccessToken(PenaltyAppInfo appInfo, TUsers user); + + /** + * 删除accessToken + * + * @param accessToken accessToken + */ + void removeAccessToken(String accessToken); + + /** + * 校验是否存在accessToken + * + * @param accessToken accessToken + * @return 校验结果 + */ + boolean existsAccessToken(String accessToken); +} diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/security/service/impl/PenaltyAppInfoServiceImpl.java b/src/main/java/com/chinaweal/aiccs/aiccs/security/service/impl/PenaltyAppInfoServiceImpl.java new file mode 100644 index 0000000..7dc52cf --- /dev/null +++ b/src/main/java/com/chinaweal/aiccs/aiccs/security/service/impl/PenaltyAppInfoServiceImpl.java @@ -0,0 +1,68 @@ +package com.chinaweal.aiccs.aiccs.security.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.chinaweal.aiccs.aiccs.security.entity.PenaltyAppInfo; +import com.chinaweal.aiccs.aiccs.security.mapper.PenaltyAppInfoMapper; +import com.chinaweal.aiccs.aiccs.security.service.IPenaltyAppInfoService; +import com.chinaweal.aiccs.common.util.StringUtils; +import com.chinaweal.aiccs.org.entity.TUsers; +import com.chinaweal.aiccs.redis.RedisService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.UUID; + +/** + * 批量吊销外部应用接入信息 服务实现类 + * + * @author lroyia + * @since 2026/1/12 16:31 + **/ +@Service +public class PenaltyAppInfoServiceImpl extends ServiceImpl implements IPenaltyAppInfoService { + + private final static String ACCESS_TOKEN_KEY_PREFIX = "penalty:security:access_token:"; + + @Autowired + private RedisService redisService; + + @Override + public TUsers getUserInfo(String accessToken) { + String key = ACCESS_TOKEN_KEY_PREFIX + accessToken; + if (redisService.exists(key)) { + String jsonStr = redisService.get(key); + if (StringUtils.isBlank(jsonStr)) { + return null; + } + JSONObject jsonObject = JSONObject.parseObject(jsonStr); + return JSONObject.parseObject(jsonObject.getJSONObject("user").toJSONString(), TUsers.class); + } + return null; + } + + @Override + public String generateAccessToken(PenaltyAppInfo appInfo, TUsers user) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("appInfo", appInfo); + jsonObject.put("user", user); + String accessToken = UUID.randomUUID().toString(); + String key = ACCESS_TOKEN_KEY_PREFIX + accessToken; + while (redisService.exists(key)) { + accessToken = UUID.randomUUID().toString(); + key = ACCESS_TOKEN_KEY_PREFIX + accessToken; + } + redisService.set(key, jsonObject.toJSONString(), 1800); + return accessToken; + } + + @Override + public void removeAccessToken(String accessToken) { + redisService.remove(ACCESS_TOKEN_KEY_PREFIX + accessToken); + } + + @Override + public boolean existsAccessToken(String accessToken) { + return redisService.exists(ACCESS_TOKEN_KEY_PREFIX + accessToken); + } +} diff --git a/src/main/java/com/chinaweal/aiccs/config/ShiroConfig.java b/src/main/java/com/chinaweal/aiccs/config/ShiroConfig.java index 67e2c20..74f0d6a 100644 --- a/src/main/java/com/chinaweal/aiccs/config/ShiroConfig.java +++ b/src/main/java/com/chinaweal/aiccs/config/ShiroConfig.java @@ -44,6 +44,7 @@ public class ShiroConfig { Map filterChainDefinitionMap = new LinkedHashMap<>(); // 设置无权限时跳转的 url; + filterChainDefinitionMap.put("/security/**", DefaultFilter.anon.name()); filterChainDefinitionMap.put("/oauth2/**", DefaultFilter.anon.name()); filterChainDefinitionMap.put("/toincludeabn/saveClue_SSJ", DefaultFilter.anon.name()); filterChainDefinitionMap.put("/toincludeabn/registration", DefaultFilter.anon.name()); diff --git a/src/main/resources/mybatis/mapper/aiccs/security/PenaltyAppInfoMapper.xml b/src/main/resources/mybatis/mapper/aiccs/security/PenaltyAppInfoMapper.xml new file mode 100644 index 0000000..df0a3da --- /dev/null +++ b/src/main/resources/mybatis/mapper/aiccs/security/PenaltyAppInfoMapper.xml @@ -0,0 +1,6 @@ + + + + + +