去除前端传递organ-id依赖

This commit is contained in:
yangsb
2024-04-19 11:56:28 +08:00
parent 29be924b51
commit 5ff48fa2ed
14 changed files with 41 additions and 22 deletions
@@ -65,7 +65,8 @@ public class OrganSecurityWebFilter extends ApiRequestFilter {
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException { throws ServletException, IOException {
Long organId = OrganContextHolder.getOrganId(); Long organId = WebFrameworkUtils.getOrganId(request);
//Long organId = OrganContextHolder.getOrganId();
boolean isRpcRequest = WebFrameworkUtils.isRpcRequest(request); boolean isRpcRequest = WebFrameworkUtils.isRpcRequest(request);
// 1. 登陆的用户,校验是否有权限访问该组织,避免越权问题。 // 1. 登陆的用户,校验是否有权限访问该组织,避免越权问题。
LoginUser user = SecurityFrameworkUtils.getLoginUser(); LoginUser user = SecurityFrameworkUtils.getLoginUser();
@@ -151,6 +151,7 @@ chenfeng:
organ: # 多组织相关配置项 organ: # 多组织相关配置项
enable: true enable: true
ignore-urls: ignore-urls:
- /rpc-api/**
ignore-tables: ignore-tables:
sms-code: # 短信验证码相关的配置项 sms-code: # 短信验证码相关的配置项
expire-times: 10m expire-times: 10m
@@ -151,7 +151,7 @@ chenfeng:
organ: # 多组织相关配置项 organ: # 多组织相关配置项
enable: true enable: true
ignore-urls: ignore-urls:
- /admin-api/manage/test - /rpc-api/**
ignore-tables: ignore-tables:
- test - test
sms-code: # 短信验证码相关的配置项 sms-code: # 短信验证码相关的配置项
@@ -151,6 +151,7 @@ chenfeng:
organ: # 多组织相关配置项 organ: # 多组织相关配置项
enable: true enable: true
ignore-urls: ignore-urls:
- /rpc-api/**
ignore-tables: ignore-tables:
sms-code: # 短信验证码相关的配置项 sms-code: # 短信验证码相关的配置项
expire-times: 10m expire-times: 10m
@@ -28,5 +28,9 @@ public class OAuth2AccessTokenCreateReqDTO implements Serializable {
@Schema(description = "授权范围的数组", example = "user_info") @Schema(description = "授权范围的数组", example = "user_info")
private List<String> scopes; private List<String> scopes;
@Schema(description = "组织id")
private Long organId;
@Schema(description = "数据源标识")
private String dataCode;
} }
@@ -40,14 +40,15 @@ public class OAuth2TokenApiImpl implements OAuth2TokenApi {
throw new ServerException(10023,"组织不存在"); throw new ServerException(10023,"组织不存在");
}*/ }*/
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken( OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(
reqDTO.getUserId(), reqDTO.getUserType(), reqDTO.getClientId(), reqDTO.getScopes(), null, null, null, null); reqDTO.getUserId(), reqDTO.getUserType(), reqDTO.getClientId(), reqDTO.getScopes(), null, null, null, reqDTO.getDataCode(), reqDTO.getOrganId());
return success(BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenRespDTO.class)); return success(BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenRespDTO.class));
} }
@Override @Override
public CommonResult<OAuth2AccessTokenCheckRespDTO> checkAccessToken(String accessToken) { public CommonResult<OAuth2AccessTokenCheckRespDTO> checkAccessToken(String accessToken) {
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.checkAccessToken(accessToken); OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.checkAccessToken(accessToken);
return success(BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenCheckRespDTO.class)); OAuth2AccessTokenCheckRespDTO bean = BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenCheckRespDTO.class);
return success(bean);
} }
@Override @Override
@@ -1,6 +1,7 @@
package com.cf.imes.module.system.dal.dataobject.oauth2; package com.cf.imes.module.system.dal.dataobject.oauth2;
import com.cf.imes.framework.common.enums.UserTypeEnum; import com.cf.imes.framework.common.enums.UserTypeEnum;
import com.cf.imes.framework.mybatis.core.dataobject.BaseDO;
import com.cf.imes.framework.organ.core.db.OrganBaseDO; import com.cf.imes.framework.organ.core.db.OrganBaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
@@ -25,7 +26,7 @@ import java.util.List;
@KeySequence("system_oauth2_access_token_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @KeySequence("system_oauth2_access_token_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class OAuth2AccessTokenDO extends OrganBaseDO { public class OAuth2AccessTokenDO extends BaseDO {
/** /**
* 编号,数据库递增 * 编号,数据库递增
@@ -82,4 +83,6 @@ public class OAuth2AccessTokenDO extends OrganBaseDO {
*/ */
private String dataCode; private String dataCode;
private Long organId;
} }
@@ -75,5 +75,9 @@ public class OAuth2RefreshTokenDO extends BaseDO {
* 数据源编码 * 数据源编码
*/ */
private String dataCode; private String dataCode;
/**
* 组织id
*/
private Long organId;
} }
@@ -133,6 +133,7 @@ public class ApplicationServiceImpl implements ApplicationService{
null, null,
null, null,
null, null,
null,
null); null);
// 构建返回结果 // 构建返回结果
return AuthConvert.INSTANCE.convert(accessTokenDO); return AuthConvert.INSTANCE.convert(accessTokenDO);
@@ -130,7 +130,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
throw exception(ORGAN_DATA_CODE_NOT_EXISTS); throw exception(ORGAN_DATA_CODE_NOT_EXISTS);
} }
// 创建 Token 令牌,记录登录日志 // 创建 Token 令牌,记录登录日志
return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME, dataSourceCode); return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME, dataSourceCode, user.getOrganId());
} }
@Override @Override
@@ -161,7 +161,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
// 创建 Token 令牌,记录登录日志 // 创建 Token 令牌,记录登录日志
return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE, dataSourceCode); return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE, dataSourceCode, organId);
} }
private void createLoginLog(Long userId, String username, private void createLoginLog(Long userId, String username,
@@ -206,7 +206,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
// 创建 Token 令牌,记录登录日志 // 创建 Token 令牌,记录登录日志
return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL, dataSourceCode); return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL, dataSourceCode, organId);
} }
@VisibleForTesting @VisibleForTesting
@@ -228,7 +228,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
} }
private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType, String dataCode) { private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType, String dataCode, Long organId) {
// 插入登陆日志 // 插入登陆日志
createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS); createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS);
/*Long organId = OrganContextHolder.getOrganId(); /*Long organId = OrganContextHolder.getOrganId();
@@ -238,7 +238,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
}*/ }*/
// 创建访问令牌 // 创建访问令牌
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, getUserType().getValue(), OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, getUserType().getValue(),
OAuth2ClientConstants.CLIENT_ID_DEFAULT, null, null, null, null, dataCode); OAuth2ClientConstants.CLIENT_ID_DEFAULT, null, null, null, null, dataCode, organId);
// 构建返回结果 // 构建返回结果
return AuthConvert.INSTANCE.convert(accessTokenDO); return AuthConvert.INSTANCE.convert(accessTokenDO);
} }
@@ -47,7 +47,7 @@ public class OAuth2GrantServiceImpl implements OAuth2GrantService {
if(Objects.isNull(organ)) { if(Objects.isNull(organ)) {
throw new ServerException(10023,"组织不存在"); throw new ServerException(10023,"组织不存在");
}*/ }*/
return oauth2TokenService.createAccessToken(userId, userType, clientId, scopes, null, null, null, null); return oauth2TokenService.createAccessToken(userId, userType, clientId, scopes, null, null, null, null, null);
} }
@Override @Override
@@ -85,7 +85,7 @@ public class OAuth2GrantServiceImpl implements OAuth2GrantService {
// 创建访问令牌 // 创建访问令牌
return oauth2TokenService.createAccessToken(codeDO.getUserId(), codeDO.getUserType(), return oauth2TokenService.createAccessToken(codeDO.getUserId(), codeDO.getUserType(),
codeDO.getClientId(), codeDO.getScopes(),null, null, null, null); codeDO.getClientId(), codeDO.getScopes(),null, null, null, null, null);
} }
@Override @Override
@@ -99,7 +99,7 @@ public class OAuth2GrantServiceImpl implements OAuth2GrantService {
throw new ServerException(10023,"组织不存在"); throw new ServerException(10023,"组织不存在");
}*/ }*/
// 创建访问令牌 // 创建访问令牌
return oauth2TokenService.createAccessToken(user.getId(), UserTypeEnum.ADMIN.getValue(), clientId, scopes,null, null, null, null); return oauth2TokenService.createAccessToken(user.getId(), UserTypeEnum.ADMIN.getValue(), clientId, scopes,null, null, null, null,null);
} }
@Override @Override
@@ -27,7 +27,7 @@ public interface OAuth2TokenService {
* @param scopes 授权范围 * @param scopes 授权范围
* @return 访问令牌的信息 * @return 访问令牌的信息
*/ */
OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List<String> scopes, Boolean large, Integer dbNo, Integer tableNo, String dataCode); OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List<String> scopes, Boolean large, Integer dbNo, Integer tableNo, String dataCode, Long organId);
/** /**
* 刷新访问令牌 * 刷新访问令牌
@@ -45,10 +45,10 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
@Override @Override
@Transactional @Transactional
public OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List<String> scopes,Boolean large, Integer dbNo, Integer tableNo, String dataCode) { public OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List<String> scopes,Boolean large, Integer dbNo, Integer tableNo, String dataCode, Long organId) {
OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId);
// 创建刷新令牌 // 创建刷新令牌
OAuth2RefreshTokenDO refreshTokenDO = createOAuth2RefreshToken(userId, userType, clientDO, scopes, large, dbNo, tableNo, dataCode); OAuth2RefreshTokenDO refreshTokenDO = createOAuth2RefreshToken(userId, userType, clientDO, scopes, large, dbNo, tableNo, dataCode, organId);
// 创建访问令牌 // 创建访问令牌
return createOAuth2AccessToken(refreshTokenDO, clientDO); return createOAuth2AccessToken(refreshTokenDO, clientDO);
} }
@@ -147,12 +147,13 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
return accessTokenDO; return accessTokenDO;
} }
private OAuth2RefreshTokenDO createOAuth2RefreshToken(Long userId, Integer userType, OAuth2ClientDO clientDO, List<String> scopes, Boolean large, Integer dbNo, Integer tableNo, String dataCode) { private OAuth2RefreshTokenDO createOAuth2RefreshToken(Long userId, Integer userType, OAuth2ClientDO clientDO, List<String> scopes, Boolean large, Integer dbNo, Integer tableNo, String dataCode, Long organId) {
OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO().setRefreshToken(generateRefreshToken()) OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO().setRefreshToken(generateRefreshToken())
.setUserId(userId).setUserType(userType) .setUserId(userId).setUserType(userType)
.setClientId(clientDO.getClientId()).setScopes(scopes) .setClientId(clientDO.getClientId()).setScopes(scopes)
.setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getRefreshTokenValiditySeconds())) .setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getRefreshTokenValiditySeconds()))
.setLarge(large).setDbNo(dbNo).setTableNo(tableNo).setDataCode(dataCode) .setLarge(large).setDbNo(dbNo).setTableNo(tableNo).setDataCode(dataCode)
.setOrganId(organId)
; ;
oauth2RefreshTokenMapper.insert(refreshToken); oauth2RefreshTokenMapper.insert(refreshToken);
return refreshToken; return refreshToken;
@@ -157,11 +157,13 @@ chenfeng:
- /admin-api/system/label-template/* - /admin-api/system/label-template/*
- /admin-api/system/machine-template/* - /admin-api/system/machine-template/*
- /admin-api/system/data-source/* - /admin-api/system/data-source/*
- /rpc-api/system/organ/valid # 防止递归。避免调用 /rpc-api/system/organ/valid 接口时,又去触发 /rpc-api/system/organ/valid 去校验 - /admin-api/system/auth/login
- /rpc-api/system/organ/id-list # 获得组织列表的时候,无需传递组织编号 - /rpc-api/**
- /rpc-api/system/error-code/* # 错误码的自动创建与下载的接口,无法带上组织编号 #- /rpc-api/system/organ/valid # 防止递归。避免调用 /rpc-api/system/organ/valid 接口时,又去触发 /rpc-api/system/organ/valid 去校验
- /rpc-api/system/oauth2/token/check # 访问令牌校验时,无需传递组织编号;主要解决上传文件的场景,前端不会传递 tenant-id! #- /rpc-api/system/organ/id-list # 获得组织列表的时候,无需传递组织编号
- /rpc-api/system/permission/has-any-permissions #- /rpc-api/system/error-code/* # 错误码的自动创建与下载的接口,无法带上组织编号
#- /rpc-api/system/oauth2/token/check # 访问令牌校验时,无需传递组织编号;主要解决上传文件的场景,前端不会传递 tenant-id!
#- /rpc-api/system/permission/has-any-permissions
ignore-tables: ignore-tables:
- system_organization - system_organization
- system_tenant_package - system_tenant_package