Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
0f66390a
提交
0f66390a
authored
11月 11, 2022
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修复创建租户报错的问题
上级
9dfe6d27
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
18 行增加
和
3 行删除
+18
-3
DeptDataPermissionRule.java
...datapermission/core/rule/dept/DeptDataPermissionRule.java
+1
-2
TenantSecurityWebFilter.java
...amework/tenant/core/security/TenantSecurityWebFilter.java
+4
-1
WebFrameworkUtils.java
...oder/yudao/framework/web/core/util/WebFrameworkUtils.java
+11
-0
TenantServiceImpl.java
...yudao/module/system/service/tenant/TenantServiceImpl.java
+2
-0
没有找到文件。
yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java
浏览文件 @
0f66390a
...
@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
...
@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.iocoder.yudao.framework.common.enums.UserTypeEnum
;
import
cn.iocoder.yudao.framework.common.enums.UserTypeEnum
;
import
cn.iocoder.yudao.framework.common.pojo.CommonResult
;
import
cn.iocoder.yudao.framework.common.util.collection.CollectionUtils
;
import
cn.iocoder.yudao.framework.common.util.collection.CollectionUtils
;
import
cn.iocoder.yudao.framework.common.util.json.JsonUtils
;
import
cn.iocoder.yudao.framework.common.util.json.JsonUtils
;
import
cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRule
;
import
cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRule
;
...
@@ -106,7 +105,7 @@ public class DeptDataPermissionRule implements DataPermissionRule {
...
@@ -106,7 +105,7 @@ public class DeptDataPermissionRule implements DataPermissionRule {
DeptDataPermissionRespDTO
deptDataPermission
=
loginUser
.
getContext
(
CONTEXT_KEY
,
DeptDataPermissionRespDTO
.
class
);
DeptDataPermissionRespDTO
deptDataPermission
=
loginUser
.
getContext
(
CONTEXT_KEY
,
DeptDataPermissionRespDTO
.
class
);
// 从上下文中拿不到,则调用逻辑进行获取
// 从上下文中拿不到,则调用逻辑进行获取
if
(
deptDataPermission
==
null
)
{
if
(
deptDataPermission
==
null
)
{
deptDataPermission
=
permissionApi
.
getDeptDataPermission
(
loginUser
.
getId
()).
getData
();
deptDataPermission
=
permissionApi
.
getDeptDataPermission
(
loginUser
.
getId
()).
get
Checked
Data
();
if
(
deptDataPermission
==
null
)
{
if
(
deptDataPermission
==
null
)
{
log
.
error
(
"[getExpression][LoginUser({}) 获取数据权限为 null]"
,
JsonUtils
.
toJsonString
(
loginUser
));
log
.
error
(
"[getExpression][LoginUser({}) 获取数据权限为 null]"
,
JsonUtils
.
toJsonString
(
loginUser
));
throw
new
NullPointerException
(
String
.
format
(
"LoginUser(%d) Table(%s/%s) 未返回数据权限"
,
throw
new
NullPointerException
(
String
.
format
(
"LoginUser(%d) Table(%s/%s) 未返回数据权限"
,
...
...
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/security/TenantSecurityWebFilter.java
浏览文件 @
0f66390a
...
@@ -14,6 +14,7 @@ import cn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService;
...
@@ -14,6 +14,7 @@ import cn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService;
import
cn.iocoder.yudao.framework.web.config.WebProperties
;
import
cn.iocoder.yudao.framework.web.config.WebProperties
;
import
cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter
;
import
cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter
;
import
cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler
;
import
cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler
;
import
cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.util.AntPathMatcher
;
import
org.springframework.util.AntPathMatcher
;
...
@@ -65,6 +66,7 @@ public class TenantSecurityWebFilter extends ApiRequestFilter {
...
@@ -65,6 +66,7 @@ public class TenantSecurityWebFilter extends ApiRequestFilter {
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
tenantId
=
TenantContextHolder
.
getTenantId
();
Long
tenantId
=
TenantContextHolder
.
getTenantId
();
boolean
isRpcRequest
=
!
WebFrameworkUtils
.
isRpcRequest
(
request
);
// 1. 登陆的用户,校验是否有权限访问该租户,避免越权问题。
// 1. 登陆的用户,校验是否有权限访问该租户,避免越权问题。
LoginUser
user
=
SecurityFrameworkUtils
.
getLoginUser
();
LoginUser
user
=
SecurityFrameworkUtils
.
getLoginUser
();
if
(
user
!=
null
)
{
if
(
user
!=
null
)
{
...
@@ -73,7 +75,8 @@ public class TenantSecurityWebFilter extends ApiRequestFilter {
...
@@ -73,7 +75,8 @@ public class TenantSecurityWebFilter extends ApiRequestFilter {
tenantId
=
user
.
getTenantId
();
tenantId
=
user
.
getTenantId
();
TenantContextHolder
.
setTenantId
(
tenantId
);
TenantContextHolder
.
setTenantId
(
tenantId
);
// 如果传递了租户编号,则进行比对租户编号,避免越权问题
// 如果传递了租户编号,则进行比对租户编号,避免越权问题
}
else
if
(!
Objects
.
equals
(
user
.
getTenantId
(),
TenantContextHolder
.
getTenantId
()))
{
}
else
if
(!
Objects
.
equals
(
user
.
getTenantId
(),
TenantContextHolder
.
getTenantId
())
&&
!
isRpcRequest
)
{
// Cloud 特殊逻辑:如果是 RPC 请求,就不校验了。主要考虑,一些场景下,会调用 TenantUtils 去切换租户
log
.
error
(
"[doFilterInternal][租户({}) User({}/{}) 越权访问租户({}) URL({}/{})]"
,
log
.
error
(
"[doFilterInternal][租户({}) User({}/{}) 越权访问租户({}) URL({}/{})]"
,
user
.
getTenantId
(),
user
.
getId
(),
user
.
getUserType
(),
user
.
getTenantId
(),
user
.
getId
(),
user
.
getUserType
(),
TenantContextHolder
.
getTenantId
(),
request
.
getRequestURI
(),
request
.
getMethod
());
TenantContextHolder
.
getTenantId
(),
request
.
getRequestURI
(),
request
.
getMethod
());
...
...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java
浏览文件 @
0f66390a
package
cn
.
iocoder
.
yudao
.
framework
.
web
.
core
.
util
;
package
cn
.
iocoder
.
yudao
.
framework
.
web
.
core
.
util
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.iocoder.yudao.framework.common.enums.RpcConstants
;
import
cn.iocoder.yudao.framework.common.enums.UserTypeEnum
;
import
cn.iocoder.yudao.framework.common.enums.UserTypeEnum
;
import
cn.iocoder.yudao.framework.common.pojo.CommonResult
;
import
cn.iocoder.yudao.framework.common.pojo.CommonResult
;
import
cn.iocoder.yudao.framework.web.config.WebProperties
;
import
cn.iocoder.yudao.framework.web.config.WebProperties
;
...
@@ -124,4 +125,14 @@ public class WebFrameworkUtils {
...
@@ -124,4 +125,14 @@ public class WebFrameworkUtils {
return
servletRequestAttributes
.
getRequest
();
return
servletRequestAttributes
.
getRequest
();
}
}
/**
* 判断是否为 RPC 请求
*
* @param request 请求
* @return 是否为 RPC 请求
*/
public
static
boolean
isRpcRequest
(
HttpServletRequest
request
)
{
return
request
.
getRequestURI
().
startsWith
(
RpcConstants
.
RPC_API_PREFIX
);
}
}
}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java
浏览文件 @
0f66390a
...
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
...
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import
cn.iocoder.yudao.framework.common.pojo.PageResult
;
import
cn.iocoder.yudao.framework.common.pojo.PageResult
;
import
cn.iocoder.yudao.framework.common.util.collection.CollectionUtils
;
import
cn.iocoder.yudao.framework.common.util.collection.CollectionUtils
;
import
cn.iocoder.yudao.framework.common.util.date.DateUtils
;
import
cn.iocoder.yudao.framework.common.util.date.DateUtils
;
import
cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission
;
import
cn.iocoder.yudao.framework.tenant.config.TenantProperties
;
import
cn.iocoder.yudao.framework.tenant.config.TenantProperties
;
import
cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder
;
import
cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder
;
import
cn.iocoder.yudao.framework.tenant.core.util.TenantUtils
;
import
cn.iocoder.yudao.framework.tenant.core.util.TenantUtils
;
...
@@ -96,6 +97,7 @@ public class TenantServiceImpl implements TenantService {
...
@@ -96,6 +97,7 @@ public class TenantServiceImpl implements TenantService {
@Override
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Transactional
(
rollbackFor
=
Exception
.
class
)
@DataPermission
(
enable
=
false
)
// 租户创建,不需要数据权限,避免出现被数据权限拦截
public
Long
createTenant
(
TenantCreateReqVO
createReqVO
)
{
public
Long
createTenant
(
TenantCreateReqVO
createReqVO
)
{
// 校验套餐被禁用
// 校验套餐被禁用
TenantPackageDO
tenantPackage
=
tenantPackageService
.
validTenantPackage
(
createReqVO
.
getPackageId
());
TenantPackageDO
tenantPackage
=
tenantPackageService
.
validTenantPackage
(
createReqVO
.
getPackageId
());
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论