3K Star 7.6K Fork 3.2K

GVPdotNET China / Furion

 / 详情

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

Done
Opened this issue  
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

期待结果

期待的结果是?


Comments (8)

靳敏杰 created任务
靳敏杰 set related repository to dotNET China/Furion
靳敏杰 changed description
Expand operation logs

= =,动态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沟通。

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

靳敏杰 changed description
靳敏杰 changed description
百小僧 set assignee to 百小僧
百小僧 added
 
建议
label
百小僧 added
 
疑问
label
百小僧 set branch to master
百小僧 set deadline to 2021-03-30
百小僧 set start time to 2021-03-29
百小僧 changed deadline from 2021-03-30 to 2021-03-29
百小僧 through dotnetchina/Furion Commit 7f81d82 changed issue state from 待办的 to 已完成

这个功能暂时放弃了哈。

辣条老板 changed description
辣条老板 changed description
辣条老板 changed description
辣条老板 changed description
辣条老板 changed description
辣条老板 changed description

Sign in to comment

Status
Assignees
Milestones
Pull Requests
Successfully merging a pull request will close this issue.
Branches
Planed to start   -   Planed to end
-
Top level
Priority
参与者(2)
974299 monksoul 1578937227 7636803 jmj1991 1596199057
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion

Search