INTPImplClient_User#getAccessToken() SHALL 通过 client_credentials 流程获取 access_token,并使用 UtilToken 缓存。CRUD 方法 MUST 接收 access_token 作为第一个参数,调用方先调 getAccessToken() 再传入。
UtilToken 缓存中无 integration:accessToken{baseUrl}/iam/token 发 POST,body 为 application/x-www-form-urlencoded,字段:grant_type=client_credentials / client_id={IntpConf.clientId} / client_secret={IntpConf.clientSecret}access_token 写入缓存,TTL = expires_in - 60 秒UtilToken 缓存中已有未过期的 integration:accessTokenerror/error_descriptionINTPClient_User.createUser SHALL 对齐 apifox 接口 POST /iam/api/users。必填字段必须显式入参;可选字段通过 body_ext Map 注入。
createUser(accessToken, "alice", "Pwd@123", null){baseUrl}/iam/api/users 发 POST application/jsonAuthorization: Bearer {accessToken}{"username":"alice","password":"Pwd@123"}body_ext 含 name / email / phone_number / user_job_number / nick_name / picture / org_ids / address / title / hired_date / tag / group_positionsusername / password 与 body_ext 全部字段{"result":false,"error":"USER_EXIST","error_description":"用户已存在"}McR.error("USER_EXIST", "用户已存在")INTPClient_User.updateUser SHALL 对齐 apifox 接口 PATCH /iam/api/user。username 通过 Query Param 传递(非 Path),其它字段全部走 body。
updateUser(accessToken, "alice", Map.of("email", "alice@new.com")){baseUrl}/iam/api/user?username=alice 发 PATCH{"email":"alice@new.com"}INTPClient_User.deleteUsers SHALL 对齐 apifox 接口 POST /iam/api/users/delete。HTTP 方法是 POST,因 body 需带 username 数组。
deleteUsers(accessToken, List.of("alice","bob")){baseUrl}/iam/api/users/delete 发 POST application/json{"usernames":["alice","bob"]}INTPClient_User.queryUsers SHALL 对齐 apifox 接口 GET /iam/api/users,支持分页与多维过滤。
queryUsers(accessToken, Map.of("q","alice","page",1,"size",20)){baseUrl}/iam/api/users?q=alice&page=1&size=20 发 GETdata.items[] 返回 McR.success(data)INTPConf SHALL 通过 Spring @ConfigurationProperties("integration") 加载配置;baseUrl 不含 /iam 前缀。
mjava-mcli / mjava-shunfeng / mjava-guangming 的 application-{dev,prod}.yml.exampleintegration: 段示例,字段:baseUrl / clientId / clientSecret${INTP_CLIENT_ID} / ${INTP_CLIENT_SECRET} 环境变量注入