6K Star 11.7K Fork 4K

GVPdotNET China / Furion

 / 详情

DynamicApiController如何在运行时决定是否公开一个Action

已完成
创建于  
2021-03-25 13:50

特别说明:如果 Issue 报告为问题且开发成员回复确认问题之后但三天内都不能得到反馈,则视为无效Issue。

Furion 版本号

哪个版本号?
1.16.4

Web 项目类型

  • WebApi
  • Mvc
  • Razor Pages
  • Blazor Server

描述你的问题

我实现了一个Abp风格的CrudAppService
这样我可以通过继承该类,通过如下代码,快速生成一系列RESTful风格的接口。

public class MedicalCategoryAppService :
        CrudAppService<Guid,
                        MedicalCategory,
                        MedicalCategoryDto,
                        AddMedicalCategoryInput,
                        UpdateMedicalCategoryInput,
                        PagedResultRequestDto>,
        IMedicalCategoryAppService,
        IDynamicApiController,
        ITransient
    {
        public MedicalCategoryAppService(IRepository<MedicalCategory> repository) : base(repository)
        {
        }

    }

一切都很美好
然后我又面对了一个新的需求。
同样的实体,我需要生成两套权限不一样的Service

// for backend admin
[Authorize("Admin")]
public FirstAppService

// for mobile
[Authorize("MobileApi")]
public SecondAppService

在第二个服务中,我希望一些action被隐藏
即贴上[NonAction]
如果只是区分只读和增删改,我可以通过继承一个方法更少的ReadOnlyCrudAppService来实现。

但是如果我想灵活一点,只是隐藏一个删除方法。
例如写成如下代码

// 构造函数
public SecondAppService(IRespository<MyEntity> repository, CrudAppServiceOptions options):base(repository,options)
{
    options.DeleteActionVisible = false;
}

我应该怎么做呢? 或者我应该去阅读哪方面的文档?


异常堆栈信息

异常堆栈是什么?


代码或代码仓库

什么代码导致?


数据库信息

  • Sqlite
  • SqlServer
  • Mysql
  • Oracle
  • PGSql
  • Firebird
  • Cosmos

期待结果

期待的结果是?


评论 (8)

靳敏杰 创建了任务
靳敏杰 关联仓库设置为dotNET China/Furion
靳敏杰 修改了描述
展开全部操作日志

= =,动态api文档本来就有啊。。。。

如果标志不是一个 Action[NonAction] 特性即可。
如果只是想隐藏,贴 [ApiDescriptionSettings(false)] 即可。

文档地址:https://dotnetchina.gitee.io/furion/docs/dynamic-api-controller#5811-%E4%B8%8D%E5%85%AC%E5%BC%80%E6%8E%A7%E5%88%B6%E5%99%A8%E6%88%96%E5%8A%A8%E4%BD%9C%E6%96%B9%E6%B3%95

输入图片说明输入图片说明

我理解你的意思了,你是希望公用的功能有不同的权限。比如在admin中不显示,在其他的又可以显示。

感谢回复!对的!
我想到了一种方法,我可以override基类的方法贴[NonAction]

[NonAction]
public override Task<MedicalCategoryDto> DeleteAsync(Guid id)
{
      return base.DeleteAsync(id);
}

不过这样感觉不酷!

如果只是控制权限这个很容易,通过 JwtHandler 就可以实现不同的分组或不同的api有不同的权限。现在的需求是不同权限运行时隐藏。还得是运行时动态处理,这个我好好想想。

好像您还是有些误会。
这个和用户是没有关系的。
因为是两个Service,他们的路由是不同的,虽然可能操作的是同样的实体,但是每个动作的实现细节是有差异的。
所以也有可能第二个service根本不提供删除方法。

因为我没有看您的源码,我只是在想DynamicApiController生成的时候是不是可以很方便的搞定这个事情。
才发了这个issue。

来qq私聊我,可能还没准确理解您的需求,qq沟通。

这个确实是一个好需求,我现在有解决方案,但是我想想怎么设计更好。这个需求我收了。

靳敏杰 修改了描述
靳敏杰 修改了描述
百小僧 负责人设置为百小僧
百小僧 添加了
 
建议
标签
百小僧 添加了
 
疑问
标签
百小僧 关联分支设置为master
百小僧 计划截止日期设置为2021-03-30
百小僧 计划开始日期设置为2021-03-29
百小僧 计划截止日期2021-03-30 修改为2021-03-29
百小僧 通过 dotnetchina/Furion Commit 7f81d82任务状态待办的 修改为已完成

这个功能暂时放弃了哈。

辣条老板 修改了描述
辣条老板 修改了描述
辣条老板 修改了描述
辣条老板 修改了描述
辣条老板 修改了描述
辣条老板 修改了描述
辣条老板 关联分支master 修改为未关联

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
974299 monksoul 1578937227 7636803 jmj1991 1596199057
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion

搜索帮助