【问题标题】:How to update Abp Permission Cache for each application如何为每个应用程序更新 Abp Permission Cache
【发布时间】:2023-01-21 13:31:42
【问题描述】:

我有多项服务(Administration.Api、Project.Api) 管理服务管理权限(创建、更新)。

但是我有一个关于缓存的问题,当我通过 Administration.Api 更新权限时,Project api 的缓存权限授予不会立即更改(它会在 20 分钟后更改,当缓存自动删除时) 我想立即更改不同缓存前缀下的所有权限缓存。我怎样才能解决这个问题?

【问题讨论】:

    标签: caching permissions abp


    【解决方案1】:

    您确实需要真正的分布式缓存服务(如 Redis)才能正确执行此操作。这样,一个缓存转储会影响所有服务。

    您可以尝试其他解决方案,但实际上它们只是创可贴,而且更多的是有潜在的其他副作用。

    • 使用消息总线通知所有服务权限更改并转储它们的内存缓存
    • 使用新的共享数据库表添加带有“LastUpdated”的新行。权限服务需要写入权限更改时的更新时间。每个服务都需要查询此表以检查更新的更新时间(针对每个请求),并转储内存缓存(如果存在)。

    【讨论】:

    • 其实我用的是redis。服务在 abp 中有不同的缓存前缀,当我更新 AdministrationService 上的 ProjectService 方法权限时(权限创建或更新此服务)ProjectService 权限缓存在 redis 上未更改。我想知道 abp 框架如何解决这个问题。感谢您的建议,但我想框架可以提供这个,但如何提供?
    • 在这种情况下,我可能建议提供您自己的 IDistributedCacheKeyNormalizer 接口实现。这将允许您为权限缓存条目以外的所有条目应用应用程序前缀。 docs.abp.io/en/abp/latest/…
    • 没关系!..谢谢杰森。
    【解决方案2】:

    您可以使用 AbpDistributedCacheOptions 更改默认缓存设置并为您的应用程序添加前缀以进行缓存。

    Configure<AbpDistributedCacheOptions>(options =>
    {
        options.GlobalCacheEntryOptions = new DistributedCacheEntryOptions()
        {
            AbsoluteExpiration =  //20 mins default
        };
        options.KeyPrefix = "MyApp1";
    });
    

    您还可以扩展覆盖权限管理供应商,例如 RolePermissionManagementProvider 并处理缓存失效。

    关于权限管理提供者的文档:https://docs.abp.io/en/abp/latest/Modules/Permission-Management#permission-management-providers

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多