动态过滤QueryFilter.Add(new SqlFilterItem()},实现数据权限,aop的时候获取不到类型 返回

SqlSugar 沟通中
48 778
该叫什么 fry 发布于1个月前
悬赏:0 飞吻

如题:有些表设置了数据权限,有些表没有设置数据权限,aop动态顾虑的时候想获取到查的表类型怎么处理?

image.png

热忱回答48

  • fate sta fate sta VIP0
    1个月前

    这种写法早就不推荐用了。改成接口方式实现过滤器

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:aop里面怎么获取表的type

    0 回复
  • fate sta fate sta VIP0
    1个月前

    描述清楚业务。   

    0 回复
  • fate sta fate sta VIP0
    1个月前

    新版本过滤器是从根本解决问题,可以根据根据实体的接口自动结合用户过滤 。

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:数据权限,要实现动态条件过滤,比如:动态查询自己的数据(数据权限);本部门的数据(数据权限);本部门和子部门数据(数据权限)


    image.png

    0 回复
  • fate sta fate sta VIP0
    1个月前

    image.png

    0 回复
  • fate sta fate sta VIP0
    1个月前

    支持动态构造。

    0 回复
  • fate sta fate sta VIP0
    1个月前
    //符合条件执行过滤器
    db.QueryFilter.AddTableFilterIF<IDeleted>(IsFilter==true ,it => it.IsDelete==false);

    多部分情况也可以用

    AddTableFilterIF

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:基于角色的自定义动态数据权限,先配置权限,后使用,权限配置表(DataPermissionConfig)结构如下:

    image.png


    比如:角色(普通职员) 只能看自己的销售订单数据,

              角色(销售主管)可以看本部门的销售订单数据

              角色(总经理)可以看全部销售订单数据

              角色(大区经理)可以看全部销售订单中 销售金额>100 且<1000的销售订单

    这也可能不仅是销售订单的数据权限,在此仅以销售订单举例子


    当查询某一个表的时候,会先查这个数据权限的配置,如果用户的角色配置了这个表的动态查询,则aop自动添加条件


    已知数据权限配置表(DataPermissionConfig),SqlSugar Aop怎么自动过滤?如下源码中需要一个Type,不是表名称,AOP中怎么

    sqlSugarProvider.QueryFilter.Add(????)

    image.png

            




    0 回复
  • fry fry VIP0
    1个月前

    @fryimage.png


    为什么没有

    IsOnlyIgnoreUpdate

    这个?

    0 回复
  • fate sta fate sta VIP0
    1个月前

    不清楚你的逻辑是什么。为什么拿Type。每个type会继承接口。每个接口是一种分类。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    每个接口是不同的过滤器就可以了。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    过滤器这个功能是非常成熟的迭代3年后1年没新需求了。可能是你想法没想到我这个的正确用法。

    0 回复
  • 如果你是从数据库读出权限。那么你可以初始化反射缓存所有的Types。 通过数据库中的名字找到实体中的Type

    0 回复
  • fate sta fate sta VIP0
    1个月前

    然后在动态给不同的Type加过滤器

    0 回复
  • fate sta fate sta VIP0
    1个月前

    如果数据库中的过滤器在1000之内那就每次注册1000个就行了,一般不超过1000没有影响。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    如果超过1000最好还是用接口区分。 正常来说手动配置的条件不会太多。

    0 回复
  • fry fry VIP0
    1个月前

    @fate staimage.png

    0 回复
  • fate sta fate sta VIP0
    1个月前

    你这种联表不好处理的。

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:不是要拿type,而是要做数据权限,动态的数据权限,给角色配置,每个表都有可能配置条件(按角色),,,,,,不理解就算了,我自己研究

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:这个是别人之前提的问题,你没有回复,我现在的需求跟这个有点类似

    0 回复
  • fate sta fate sta VIP0
    1个月前

    你这种一般是接口过滤器加导航实现

    0 回复
  • fate sta fate sta VIP0
    1个月前

    定义导航对象多对多等。

    实体继承接口,比IOrg  IRole等。 有IOrg就过组织ID有IRole就过滤角色等。


    过滤器条件 it.xxx.Any(s=>s.Orgid==组织ID)

    差不多这样的,根本用不到SQL

    0 回复
  • fate sta fate sta VIP0
    1个月前

    权限操作几乎都是导航。就算不用过滤器查询也很方法。

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:你这种是一种比较通用的,比如:软删除,租户等过滤,但是我要的是动态的,比如:管理员(角色)能看订单(Order表)的全部数据,普通职员(角色)只能看自己的订单(Order表),大区销售经理(角色)可以看销售额>100且<1000的订单(Order表),这种数据权限只能根据角色对订单表配置不同的查询条件,然后把条件追加到查询sql中  (token中已经包含了角色信息)


    其他表也类似

    0 回复
  • fate sta fate sta VIP0
    1个月前

    你实体是不是都配置导航。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    只要权限的几乎都是导航操作。不可能联表去查询的,那样就浪费时间了。


    0 回复
  • fate sta fate sta VIP0
    1个月前

    where(s=>s.list.Any(y=>y.list.any()))

    基本都这样多层直接查询

    0 回复
  • fate sta fate sta VIP0
    1个月前

    只要用上导航权限不用过滤器都很方便。。不用导航就算用过滤器也屎一样的代码。

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta大区销售经理(角色)可以看销售额>100且<1000的订单(Order表) 这个怎么用导航?

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:我是想在Aop中加过滤条件

    0 回复
  • fate sta fate sta VIP0
    1个月前

    你这种就导航+过滤器实现。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    在过滤器上配置条件。If(xxx) add条件 else if(xxx) add条件

    0 回复
  • fate sta fate sta VIP0
    1个月前

    根据继承的接口进行分类。。每个分类肯定是有固定的逻辑的。

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:这种能做到很灵活?配置的都写道导航中吗?

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:我大概懂你的意思,但是觉得这样不够灵活,因为条件是可能要变,不能写死,写到导航里不就是写死了吗?

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:这种没有弄过,能提供demo吗?

    0 回复
  • fate sta fate sta VIP0
    1个月前

    @fry:你肯定有规则的从库读出来的。不会写死。当前用户会带出来

    0 回复
  • fate sta fate sta VIP0
    1个月前

    暂时没有DEMO

    0 回复
  • 导航是可以动态的。 list.Any(表格查询)

    0 回复
  • fry fry VIP0
    1个月前

    @fate staimage.png

    这边是要先配置,把配置信息读出来,然后根据登录人的角色和表名称去去追加条件


    如下:使用缓存查询配置Sql条件已经测试成功(不能在此处使用db查库)

    image.png


    模拟数据如下:

    image.png


    调试生成分页查询的Sql如下:Code Like '%001%' And Amount >= 100 And Amount < 1000    ORDER BY `Id` 

    image.png

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta

    sqlSugarProvider.QueryFilter这个过滤器能否增加一个ConditionalModel,这种
    
    如下:

    image.png

    0 回复
  • fate sta fate sta VIP0
    1个月前

    var sqlObj= db.Utilities.ConditionalModelsToSql(List<IConditionalModel> conditionalModels);

    0 回复
  • fate sta fate sta VIP0
    1个月前

    可以转成SQL

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:我看了源码,确实可以

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:在这里怎么获取要查询的实体类型或者表名称?我目前也能拿到但是不确定是否准确

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta

    SqlFilterItem必须要给一个默认值,比如 1=1 这样的Sql条件,能否提供一个sqlSugarProvider.QueryFilter.Add(Func<bool> isAppend,SqlFilterItem);这种
    条件成立追加条件,否则不添加条件

    image.png

    image.png

    0 回复
  • fry fry VIP0
    1个月前

    @fate staScreenShot_2025-12-17_093351_420.pngScreenShot_2025-12-17_093407_622.png

    目前这样是可以的,但是有几个问题:

    1:表名称不一定准确 (sqlSugarProvider.QueryFilter里面要获取查询的表名称)【db.ConfigQuery.Context.IgnoreInsertColumns这种方式目前可以获取,但是有可能不准确】

         如果使用了分表(按日期分表),表名称就对不上了

    2:sqlSugarProvider.QueryFilter.Add这里面不能再做表查询,否则查询的时候又会进入sqlSugarProvider.QueryFilter,如此形成一个死循环 

    3:IsJoinQuery = false // 单表生效   IsJoinQuery = true // 多表关联生效 ,如果对一个表同时设置单表和多表,那么sqlSugarProvider.QueryFilter.Add()要写两遍

    如下图:

    image.png


    0 回复