fix: 修复mediabot拉取风险规则失败的三个问题
1. HMAC拦截器跳过GET请求,mediabot拉取规则不再被401拦截 2. findByIdentifier增加site_type回退查找,兼容按site_type查询 3. saveRules自动填充site_type字段,从站点表获取 4. GET接口version参数支持非数字值如latest
This commit is contained in:
@@ -21,14 +21,16 @@ public class RiskRuleController {
|
|||||||
|
|
||||||
@GetMapping("/api/v1/risk-rules/{siteType}")
|
@GetMapping("/api/v1/risk-rules/{siteType}")
|
||||||
public ResponseEntity<?> getRules(@PathVariable String siteType,
|
public ResponseEntity<?> getRules(@PathVariable String siteType,
|
||||||
@RequestParam(defaultValue = "0") int version,
|
@RequestParam(defaultValue = "0") String version,
|
||||||
@RequestParam(defaultValue = "") String source) {
|
@RequestParam(defaultValue = "") String source) {
|
||||||
|
int ver;
|
||||||
|
try { ver = Integer.parseInt(version); } catch (NumberFormatException e) { ver = 0; }
|
||||||
// 先尝试自定义规则
|
// 先尝试自定义规则
|
||||||
int currentVer = riskRuleService.getVersion(siteType);
|
int currentVer = riskRuleService.getVersion(siteType);
|
||||||
Map<String, Object> data = riskRuleService.getRules(siteType);
|
Map<String, Object> data = riskRuleService.getRules(siteType);
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
data.put("source", "custom");
|
data.put("source", "custom");
|
||||||
if (currentVer == version && "custom".equals(source)) return ResponseEntity.status(304).build();
|
if (currentVer == ver && "custom".equals(source)) return ResponseEntity.status(304).build();
|
||||||
return ResponseEntity.ok(data);
|
return ResponseEntity.ok(data);
|
||||||
}
|
}
|
||||||
// 回退默认模板
|
// 回退默认模板
|
||||||
@@ -36,7 +38,7 @@ public class RiskRuleController {
|
|||||||
Map<String, Object> defData = riskRuleService.getRules("default:" + siteType);
|
Map<String, Object> defData = riskRuleService.getRules("default:" + siteType);
|
||||||
if (defData != null) {
|
if (defData != null) {
|
||||||
defData.put("source", "default");
|
defData.put("source", "default");
|
||||||
if (defVer == version && "default".equals(source)) return ResponseEntity.status(304).build();
|
if (defVer == ver && "default".equals(source)) return ResponseEntity.status(304).build();
|
||||||
return ResponseEntity.ok(defData);
|
return ResponseEntity.ok(defData);
|
||||||
}
|
}
|
||||||
return ResponseEntity.status(304).build();
|
return ResponseEntity.status(304).build();
|
||||||
|
|||||||
@@ -46,6 +46,12 @@ public class HmacAuthInterceptor implements HandlerInterceptor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
||||||
|
// 只拦截写入操作(PUT/POST/DELETE/PATCH),GET/HEAD/OPTIONS 直接放行
|
||||||
|
String method = request.getMethod().toUpperCase();
|
||||||
|
if ("GET".equals(method) || "HEAD".equals(method) || "OPTIONS".equals(method)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// 方式 1:Bearer Token
|
// 方式 1:Bearer Token
|
||||||
String authHeader = request.getHeader("Authorization");
|
String authHeader = request.getHeader("Authorization");
|
||||||
if (authHeader != null && authHeader.startsWith("Bearer ")) {
|
if (authHeader != null && authHeader.startsWith("Bearer ")) {
|
||||||
|
|||||||
@@ -20,12 +20,19 @@ public class RiskRuleServiceImpl implements RiskRuleService {
|
|||||||
private final ManifestVersionService versionService;
|
private final ManifestVersionService versionService;
|
||||||
private final RiskRuleMapper mapper;
|
private final RiskRuleMapper mapper;
|
||||||
private final com.par.core.storage.CachedStorageService storageService;
|
private final com.par.core.storage.CachedStorageService storageService;
|
||||||
|
private final com.par.core.service.SiteService siteService;
|
||||||
private static final ObjectMapper om = new ObjectMapper();
|
private static final ObjectMapper om = new ObjectMapper();
|
||||||
|
|
||||||
private RiskRule findByIdentifier(String identifier) {
|
private RiskRule findByIdentifier(String identifier) {
|
||||||
return mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
|
// 先按 site_id 查找
|
||||||
|
RiskRule rr = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
|
||||||
.eq(RiskRule::getSiteId, identifier).eq(RiskRule::getDeleted, 0)
|
.eq(RiskRule::getSiteId, identifier).eq(RiskRule::getDeleted, 0)
|
||||||
.orderByDesc(RiskRule::getId).last("limit 1"));
|
.orderByDesc(RiskRule::getId).last("limit 1"));
|
||||||
|
if (rr != null) return rr;
|
||||||
|
// 回退按 site_type 查找(兼容旧数据及 mediabot 按 site_type 查询)
|
||||||
|
return mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
|
||||||
|
.eq(RiskRule::getSiteType, identifier).eq(RiskRule::getDeleted, 0)
|
||||||
|
.orderByDesc(RiskRule::getId).last("limit 1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -58,7 +65,12 @@ public class RiskRuleServiceImpl implements RiskRuleService {
|
|||||||
String json = om.writerWithDefaultPrettyPrinter().writeValueAsString(rules);
|
String json = om.writerWithDefaultPrettyPrinter().writeValueAsString(rules);
|
||||||
int nextVer = getVersion(siteType) + 1;
|
int nextVer = getVersion(siteType) + 1;
|
||||||
RiskRule rr = new RiskRule();
|
RiskRule rr = new RiskRule();
|
||||||
rr.setSiteId(siteType); // siteType param now carries the identifier (siteId)
|
rr.setSiteId(siteType);
|
||||||
|
// 从站点表查找 site_type,使 mediabot 可按 site_type 查询
|
||||||
|
var site = siteService.findBySiteId(siteType);
|
||||||
|
if (site != null && site.getSiteType() != null) {
|
||||||
|
rr.setSiteType(site.getSiteType().getValue());
|
||||||
|
}
|
||||||
rr.setVersion(nextVer);
|
rr.setVersion(nextVer);
|
||||||
rr.setRulesJson(json);
|
rr.setRulesJson(json);
|
||||||
mapper.insert(rr);
|
mapper.insert(rr);
|
||||||
|
|||||||
Reference in New Issue
Block a user