Commit e488d737 by jianan

idP

parent 74801049
...@@ -6,6 +6,7 @@ import com.yd.user.api.service.ApiClientUserService; ...@@ -6,6 +6,7 @@ import com.yd.user.api.service.ApiClientUserService;
import com.yd.user.feign.client.clientuser.ApiClientUserFeignClient; import com.yd.user.feign.client.clientuser.ApiClientUserFeignClient;
import com.yd.user.feign.request.clientuser.*; import com.yd.user.feign.request.clientuser.*;
import com.yd.user.feign.response.clientuser.ApiClientUserDetailResponse; import com.yd.user.feign.response.clientuser.ApiClientUserDetailResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserIdpLoginResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserPageResponse; import com.yd.user.feign.response.clientuser.ApiClientUserPageResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserSaveResponse; import com.yd.user.feign.response.clientuser.ApiClientUserSaveResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -106,4 +107,12 @@ public class ApiClientUserController implements ApiClientUserFeignClient { ...@@ -106,4 +107,12 @@ public class ApiClientUserController implements ApiClientUserFeignClient {
return apiClientUserService.conditionList(request); return apiClientUserService.conditionList(request);
} }
/**
* 统一身份登录:按 IdP subject + 租户解析登录身份
*/
@Override
public Result<ApiClientUserIdpLoginResponse> getByIdpSub(String tenantBizId, String idpSub) {
return apiClientUserService.getByIdpSub(tenantBizId, idpSub);
}
} }
...@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; ...@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.user.feign.request.clientuser.*; import com.yd.user.feign.request.clientuser.*;
import com.yd.user.feign.response.clientuser.ApiClientUserDetailResponse; import com.yd.user.feign.response.clientuser.ApiClientUserDetailResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserIdpLoginResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserPageResponse; import com.yd.user.feign.response.clientuser.ApiClientUserPageResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserSaveResponse; import com.yd.user.feign.response.clientuser.ApiClientUserSaveResponse;
...@@ -23,6 +24,8 @@ public interface ApiClientUserService { ...@@ -23,6 +24,8 @@ public interface ApiClientUserService {
Result editOpenId(String clientUserBizId, String openId); Result editOpenId(String clientUserBizId, String openId);
Result<ApiClientUserIdpLoginResponse> getByIdpSub(String tenantBizId, String idpSub);
Result saveClientUserList(List<String> userBizIdList, Result saveClientUserList(List<String> userBizIdList,
String tenantBizId, String tenantBizId,
String projectBizId); String projectBizId);
......
...@@ -15,6 +15,7 @@ import com.yd.csf.feign.request.agentreferralrelation.ApiAgentReferralRelationSa ...@@ -15,6 +15,7 @@ import com.yd.csf.feign.request.agentreferralrelation.ApiAgentReferralRelationSa
import com.yd.user.api.service.ApiClientUserService; import com.yd.user.api.service.ApiClientUserService;
import com.yd.user.feign.request.clientuser.*; import com.yd.user.feign.request.clientuser.*;
import com.yd.user.feign.response.clientuser.ApiClientUserDetailResponse; import com.yd.user.feign.response.clientuser.ApiClientUserDetailResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserIdpLoginResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserPageResponse; import com.yd.user.feign.response.clientuser.ApiClientUserPageResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserSaveResponse; import com.yd.user.feign.response.clientuser.ApiClientUserSaveResponse;
import com.yd.user.feign.response.sysuser.ApiSysUserPageResponse; import com.yd.user.feign.response.sysuser.ApiSysUserPageResponse;
...@@ -173,6 +174,24 @@ public class ApiClientUserServiceImpl implements ApiClientUserService { ...@@ -173,6 +174,24 @@ public class ApiClientUserServiceImpl implements ApiClientUserService {
} }
/** /**
* 统一身份登录:按 IdP subject + 租户解析客户端用户登录身份。
*/
@Override
public Result<ApiClientUserIdpLoginResponse> getByIdpSub(String tenantBizId, String idpSub) {
ClientUser clientUser = iClientUserService.getByIdpSub(tenantBizId, idpSub);
if (Objects.isNull(clientUser)) {
return Result.success(null);
}
ApiClientUserIdpLoginResponse response = new ApiClientUserIdpLoginResponse();
response.setClientUserBizId(clientUser.getClientUserBizId());
response.setTenantBizId(clientUser.getTenantBizId());
response.setIdpSub(clientUser.getIdpSub());
response.setStatus(clientUser.getStatus());
response.setApprovalStatus(clientUser.getApprovalStatus());
return Result.success(response);
}
/**
* 同步sys_user系统用户,批量更新客户端用户表数据 * 同步sys_user系统用户,批量更新客户端用户表数据
* @param userBizIdList * @param userBizIdList
* @param tenantBizId * @param tenantBizId
......
...@@ -4,6 +4,7 @@ import com.yd.common.result.Result; ...@@ -4,6 +4,7 @@ import com.yd.common.result.Result;
import com.yd.user.feign.fallback.clientuser.ApiClientUserFeignFallbackFactory; import com.yd.user.feign.fallback.clientuser.ApiClientUserFeignFallbackFactory;
import com.yd.user.feign.request.clientuser.*; import com.yd.user.feign.request.clientuser.*;
import com.yd.user.feign.response.clientuser.ApiClientUserDetailResponse; import com.yd.user.feign.response.clientuser.ApiClientUserDetailResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserIdpLoginResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserSaveResponse; import com.yd.user.feign.response.clientuser.ApiClientUserSaveResponse;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
...@@ -83,4 +84,17 @@ public interface ApiClientUserFeignClient { ...@@ -83,4 +84,17 @@ public interface ApiClientUserFeignClient {
*/ */
@PostMapping("/condition/list") @PostMapping("/condition/list")
Result<List<ApiClientUserDetailResponse>> conditionList(@Validated @RequestBody ApiClientUserConditionListRequest request); Result<List<ApiClientUserDetailResponse>> conditionList(@Validated @RequestBody ApiClientUserConditionListRequest request);
/**
* 统一身份登录:按 IdP subject + 租户解析客户端用户登录身份(不按项目过滤)。
*
* @param tenantBizId 所属租户唯一业务ID
* @param idpSub 统一身份提供方 subject(OIDC sub)
* @return 登录身份;查不到时 data 为 null
*/
@GetMapping("/getByIdpSub")
@Operation(summary = "按IdP subject解析登录身份")
Result<ApiClientUserIdpLoginResponse> getByIdpSub(
@NotBlank(message = "租户业务ID不能为空") @RequestParam(value = "tenantBizId") String tenantBizId,
@NotBlank(message = "IdP subject不能为空") @RequestParam(value = "idpSub") String idpSub);
} }
...@@ -4,6 +4,7 @@ import com.yd.common.result.Result; ...@@ -4,6 +4,7 @@ import com.yd.common.result.Result;
import com.yd.user.feign.client.clientuser.ApiClientUserFeignClient; import com.yd.user.feign.client.clientuser.ApiClientUserFeignClient;
import com.yd.user.feign.request.clientuser.*; import com.yd.user.feign.request.clientuser.*;
import com.yd.user.feign.response.clientuser.ApiClientUserDetailResponse; import com.yd.user.feign.response.clientuser.ApiClientUserDetailResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserIdpLoginResponse;
import com.yd.user.feign.response.clientuser.ApiClientUserSaveResponse; import com.yd.user.feign.response.clientuser.ApiClientUserSaveResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.cloud.openfeign.FallbackFactory;
...@@ -58,6 +59,12 @@ public class ApiClientUserFeignFallbackFactory implements FallbackFactory<ApiCli ...@@ -58,6 +59,12 @@ public class ApiClientUserFeignFallbackFactory implements FallbackFactory<ApiCli
public Result<List<ApiClientUserDetailResponse>> conditionList(ApiClientUserConditionListRequest request) { public Result<List<ApiClientUserDetailResponse>> conditionList(ApiClientUserConditionListRequest request) {
return null; return null;
} }
@Override
public Result<ApiClientUserIdpLoginResponse> getByIdpSub(String tenantBizId, String idpSub) {
log.error("按IdP subject解析登录身份失败 tenantBizId={} idpSub={}", tenantBizId, idpSub, cause);
return null;
}
}; };
} }
} }
package com.yd.user.feign.response.clientuser;
import lombok.Data;
/**
* 统一身份(OIDC)登录后,按 IdP subject 解析出的客户端用户登录身份。
*
* <p>仅携带资源服务器做认证与门禁所需的最小字段,不含任何证件/银行卡等敏感画像。</p>
*/
@Data
public class ApiClientUserIdpLoginResponse {
/**
* 客户端用户表唯一业务ID(csf 行级数据归属键)
*/
private String clientUserBizId;
/**
* 所属租户唯一业务ID
*/
private String tenantBizId;
/**
* 统一身份提供方(Casdoor)的 subject
*/
private String idpSub;
/**
* 状态(0:停用 1:启用)
*/
private Integer status;
/**
* 审批状态(CG=成功/已审批 可登录)
*/
private String approvalStatus;
}
...@@ -37,4 +37,9 @@ public class ClientUserDto { ...@@ -37,4 +37,9 @@ public class ClientUserDto {
* 用户唯一标识(sys_user系统用户表)列表 * 用户唯一标识(sys_user系统用户表)列表
*/ */
private List<String> userBizIdList; private List<String> userBizIdList;
/**
* 统一身份提供方(Casdoor)的 subject
*/
private String idpSub;
} }
...@@ -157,6 +157,12 @@ public class ClientUser implements Serializable { ...@@ -157,6 +157,12 @@ public class ClientUser implements Serializable {
private String openId; private String openId;
/** /**
* 统一身份提供方(Casdoor)的 subject,租户内唯一;未绑定为 null
*/
@TableField("idp_sub")
private String idpSub;
/**
* 通用备注 * 通用备注
*/ */
@TableField("remark") @TableField("remark")
......
...@@ -26,4 +26,9 @@ public interface IClientUserService extends IService<ClientUser> { ...@@ -26,4 +26,9 @@ public interface IClientUserService extends IService<ClientUser> {
List<ClientUser> queryList(ClientUserDto dto); List<ClientUser> queryList(ClientUserDto dto);
ClientUser queryOne(String clientUserBizId); ClientUser queryOne(String clientUserBizId);
/**
* 按统一身份 subject 与租户定位唯一客户端用户;不按项目过滤。
*/
ClientUser getByIdpSub(String tenantBizId, String idpSub);
} }
...@@ -32,11 +32,12 @@ public class ClientUserServiceImpl extends ServiceImpl<ClientUserMapper, ClientU ...@@ -32,11 +32,12 @@ public class ClientUserServiceImpl extends ServiceImpl<ClientUserMapper, ClientU
@Override @Override
public IPage<ApiClientUserPageResponse> page(Page<ApiClientUserPageResponse> page, public IPage<ApiClientUserPageResponse> page(Page<ApiClientUserPageResponse> page,
ApiClientUserPageRequest request) { ApiClientUserPageRequest request) {
return baseMapper.page(page,request); return baseMapper.page(page, request);
} }
/** /**
* 查询列表 * 查询列表
*
* @param dto * @param dto
* @return * @return
*/ */
...@@ -47,6 +48,7 @@ public class ClientUserServiceImpl extends ServiceImpl<ClientUserMapper, ClientU ...@@ -47,6 +48,7 @@ public class ClientUserServiceImpl extends ServiceImpl<ClientUserMapper, ClientU
.eq(StringUtils.isNotBlank(dto.getProjectBizId()),ClientUser::getProjectBizId,dto.getProjectBizId()) .eq(StringUtils.isNotBlank(dto.getProjectBizId()),ClientUser::getProjectBizId,dto.getProjectBizId())
.eq(StringUtils.isNotBlank(dto.getClientUserBizId()),ClientUser::getClientUserBizId,dto.getClientUserBizId()) .eq(StringUtils.isNotBlank(dto.getClientUserBizId()),ClientUser::getClientUserBizId,dto.getClientUserBizId())
.eq(StringUtils.isNotBlank(dto.getPhone()),ClientUser::getPhone,dto.getPhone()) .eq(StringUtils.isNotBlank(dto.getPhone()),ClientUser::getPhone,dto.getPhone())
.eq(StringUtils.isNotBlank(dto.getIdpSub()), ClientUser::getIdpSub, dto.getIdpSub())
.in(!CollectionUtils.isEmpty(dto.getUserBizIdList()),ClientUser::getUserBizId,dto.getUserBizIdList()) .in(!CollectionUtils.isEmpty(dto.getUserBizIdList()),ClientUser::getUserBizId,dto.getUserBizIdList())
); );
return list; return list;
...@@ -54,11 +56,23 @@ public class ClientUserServiceImpl extends ServiceImpl<ClientUserMapper, ClientU ...@@ -54,11 +56,23 @@ public class ClientUserServiceImpl extends ServiceImpl<ClientUserMapper, ClientU
/** /**
* 查询单个对象 * 查询单个对象
*
* @param clientUserBizId * @param clientUserBizId
* @return * @return
*/ */
@Override @Override
public ClientUser queryOne(String clientUserBizId) { public ClientUser queryOne(String clientUserBizId) {
return this.getOne(new LambdaQueryWrapper<ClientUser>().eq(ClientUser::getClientUserBizId,clientUserBizId)); return this.getOne(new LambdaQueryWrapper<ClientUser>().eq(ClientUser::getClientUserBizId, clientUserBizId));
}
/**
* 按统一身份 subject 与租户定位唯一客户端用户;不按项目过滤,排除已删除行。
*/
@Override
public ClientUser getByIdpSub(String tenantBizId, String idpSub) {
return this.getOne(new LambdaQueryWrapper<ClientUser>()
.eq(ClientUser::getTenantBizId, tenantBizId)
.eq(ClientUser::getIdpSub, idpSub)
.eq(ClientUser::getIsDeleted, 0), false);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment