动态过滤QueryFilter.Add(new SqlFilterItem()},实现数据权限,aop的时候获取不到类型 返回
如题:有些表设置了数据权限,有些表没有设置数据权限,aop动态顾虑的时候想获取到查的表类型怎么处理?

热忱回答(48)
-
fate sta VIP0
1个月前这种写法早就不推荐用了。改成接口方式实现过滤器
0 回复 -
fry VIP0
1个月前@fate sta:aop里面怎么获取表的type
0 回复 -
fate sta VIP0
1个月前描述清楚业务。
0 回复 -
fate sta VIP0
1个月前新版本过滤器是从根本解决问题,可以根据根据实体的接口自动结合用户过滤 。
0 回复 -
fry VIP0
1个月前@fate sta:数据权限,要实现动态条件过滤,比如:动态查询自己的数据(数据权限);本部门的数据(数据权限);本部门和子部门数据(数据权限)
0 回复 -
fate sta VIP0
1个月前
0 回复 -
fate sta VIP0
1个月前支持动态构造。
0 回复 -
fate sta VIP0
1个月前//符合条件执行过滤器db.QueryFilter.AddTableFilterIF<IDeleted>(IsFilter==true,it => it.IsDelete==false);多部分情况也可以用
AddTableFilterIF
0 回复 -
fry VIP0
1个月前@fate sta:基于角色的自定义动态数据权限,先配置权限,后使用,权限配置表(DataPermissionConfig)结构如下:

比如:角色(普通职员) 只能看自己的销售订单数据,
角色(销售主管)可以看本部门的销售订单数据
角色(总经理)可以看全部销售订单数据
角色(大区经理)可以看全部销售订单中 销售金额>100 且<1000的销售订单
这也可能不仅是销售订单的数据权限,在此仅以销售订单举例子
当查询某一个表的时候,会先查这个数据权限的配置,如果用户的角色配置了这个表的动态查询,则aop自动添加条件
已知数据权限配置表(DataPermissionConfig),SqlSugar Aop怎么自动过滤?如下源码中需要一个Type,不是表名称,AOP中怎么
sqlSugarProvider.QueryFilter.Add(????)
0 回复 -
fry VIP0
1个月前@fry:

为什么没有
IsOnlyIgnoreUpdate
这个?
0 回复 -
fate sta VIP0
1个月前不清楚你的逻辑是什么。为什么拿Type。每个type会继承接口。每个接口是一种分类。
0 回复 -
fate sta VIP0
1个月前每个接口是不同的过滤器就可以了。
0 回复 -
fate sta VIP0
1个月前过滤器这个功能是非常成熟的迭代3年后1年没新需求了。可能是你想法没想到我这个的正确用法。
0 回复 -
fate stay night VIP0
1个月前如果你是从数据库读出权限。那么你可以初始化反射缓存所有的Types。 通过数据库中的名字找到实体中的Type
0 回复 -
fate sta VIP0
1个月前然后在动态给不同的Type加过滤器
0 回复 -
fate sta VIP0
1个月前如果数据库中的过滤器在1000之内那就每次注册1000个就行了,一般不超过1000没有影响。
0 回复 -
fate sta VIP0
1个月前如果超过1000最好还是用接口区分。 正常来说手动配置的条件不会太多。
0 回复 -
fry VIP0
1个月前@fate sta:
0 回复 -
fate sta VIP0
1个月前你这种联表不好处理的。
0 回复 -
fry VIP0
1个月前@fate sta:不是要拿type,而是要做数据权限,动态的数据权限,给角色配置,每个表都有可能配置条件(按角色),,,,,,不理解就算了,我自己研究
0 回复 -
fry VIP0
1个月前@fate sta:这个是别人之前提的问题,你没有回复,我现在的需求跟这个有点类似
0 回复 -
fate sta VIP0
1个月前你这种一般是接口过滤器加导航实现
0 回复 -
fate sta VIP0
1个月前定义导航对象多对多等。
实体继承接口,比IOrg IRole等。 有IOrg就过组织ID有IRole就过滤角色等。
过滤器条件 it.xxx.Any(s=>s.Orgid==组织ID)
差不多这样的,根本用不到SQL
0 回复 -
fate sta VIP0
1个月前权限操作几乎都是导航。就算不用过滤器查询也很方法。
0 回复 -
fry VIP0
1个月前@fate sta:你这种是一种比较通用的,比如:软删除,租户等过滤,但是我要的是动态的,比如:管理员(角色)能看订单(Order表)的全部数据,普通职员(角色)只能看自己的订单(Order表),大区销售经理(角色)可以看销售额>100且<1000的订单(Order表),这种数据权限只能根据角色对订单表配置不同的查询条件,然后把条件追加到查询sql中 (token中已经包含了角色信息)
其他表也类似
0 回复 -
fate sta VIP0
1个月前你实体是不是都配置导航。
0 回复 -
fate sta VIP0
1个月前只要权限的几乎都是导航操作。不可能联表去查询的,那样就浪费时间了。
0 回复 -
fate sta VIP0
1个月前where(s=>s.list.Any(y=>y.list.any()))
基本都这样多层直接查询
0 回复 -
fate sta VIP0
1个月前只要用上导航权限不用过滤器都很方便。。不用导航就算用过滤器也屎一样的代码。
0 回复 -
fry VIP0
1个月前@fate sta:大区销售经理(角色)可以看销售额>100且<1000的订单(Order表) 这个怎么用导航?
0 回复 -
fry VIP0
1个月前@fate sta:我是想在Aop中加过滤条件
0 回复 -
fate sta VIP0
1个月前你这种就导航+过滤器实现。
0 回复 -
fate sta VIP0
1个月前在过滤器上配置条件。If(xxx) add条件 else if(xxx) add条件
0 回复 -
fate sta VIP0
1个月前根据继承的接口进行分类。。每个分类肯定是有固定的逻辑的。
0 回复 -
fry VIP0
1个月前@fate sta:这种能做到很灵活?配置的都写道导航中吗?
0 回复 -
fry VIP0
1个月前@fate sta:我大概懂你的意思,但是觉得这样不够灵活,因为条件是可能要变,不能写死,写到导航里不就是写死了吗?
0 回复 -
fry VIP0
1个月前@fate sta:这种没有弄过,能提供demo吗?
0 回复 -
fate sta VIP0
1个月前@fry:你肯定有规则的从库读出来的。不会写死。当前用户会带出来
0 回复 -
fate sta VIP0
1个月前暂时没有DEMO
0 回复 -
fate stay night VIP0
1个月前导航是可以动态的。 list.Any(表格查询)
0 回复 -
fry VIP0
1个月前@fate sta:

这边是要先配置,把配置信息读出来,然后根据登录人的角色和表名称去去追加条件
如下:使用缓存查询配置Sql条件已经测试成功(不能在此处使用db查库)

模拟数据如下:

调试生成分页查询的Sql如下:Code Like '%001%' And Amount >= 100 And Amount < 1000 ORDER BY `Id`
0 回复 -
fry VIP0
1个月前@fate sta:
sqlSugarProvider.QueryFilter这个过滤器能否增加一个ConditionalModel,这种 如下:
0 回复 -
fate sta VIP0
1个月前var sqlObj= db.Utilities.ConditionalModelsToSql(List<IConditionalModel> conditionalModels);
0 回复 -
fate sta VIP0
1个月前可以转成SQL
0 回复 -
fry VIP0
1个月前@fate sta:我看了源码,确实可以
0 回复 -
fry VIP0
1个月前@fate sta:在这里怎么获取要查询的实体类型或者表名称?我目前也能拿到但是不确定是否准确
0 回复 -
fry VIP0
1个月前@fate sta:
SqlFilterItem必须要给一个默认值,比如 1=1 这样的Sql条件,能否提供一个sqlSugarProvider.QueryFilter.Add(Func<bool> isAppend,SqlFilterItem);这种 条件成立追加条件,否则不添加条件

0 回复 -
fry VIP0
1个月前@fate sta:


目前这样是可以的,但是有几个问题:
1:表名称不一定准确 (sqlSugarProvider.QueryFilter里面要获取查询的表名称)【db.ConfigQuery.Context.IgnoreInsertColumns这种方式目前可以获取,但是有可能不准确】
如果使用了分表(按日期分表),表名称就对不上了
2:sqlSugarProvider.QueryFilter.Add这里面不能再做表查询,否则查询的时候又会进入sqlSugarProvider.QueryFilter,如此形成一个死循环
3:IsJoinQuery = false // 单表生效 IsJoinQuery = true // 多表关联生效 ,如果对一个表同时设置单表和多表,那么sqlSugarProvider.QueryFilter.Add()要写两遍
如下图:
0 回复