Tencent / APIJSON

🏆 实时 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构 🏆 Real-Time coding-free, powerful and secure ORM 🚀 providing APIs and Docs without coding by Backend, and the returned JSON of API can be customized by Frontend(Client) users
http://apijson.cn
Other
17.14k stars 2.15k forks source link

在使用apijson-router 接口权限方案咨询 #735

Open csx-bill opened 3 months ago

csx-bill commented 3 months ago

Description

在接入 apijson-router ,我想对每个用户访问接口做一个权限校验 例如:在编写代码的时候,接口上面会有一个鉴权权限的注解 (@PreAuth("sysuser:save")) 是否有新增的权限 image

我想对 apijson-router 的接口也实现类似的功能,有什么更好的方案 我目前是在 document 表增加了一个字段,存储这个权限,实现这个功能

TommyLemon commented 3 months ago

新增一个接口,加上 @PreAuth 注解,方法内部实现就是转发调用 APIJSON 的万能通用接口对应方法

csx-bill commented 3 months ago

新增一个接口,加上 @preauth 注解,方法内部实现就是转发调用 APIJSON 的万能通用接口对应方法

每个接口都新增接口?

我是想万能通用接口实现 @preauth 权限校验

TommyLemon commented 3 months ago

注解里不允许变量,所以 "sysuser:save" 没法对应万能通用接口中灵活多变的 表名,例如 Moment, Comment 等,应该只对应 User 表。 所以如果要想一个接口兼容各种权限校验,就不要用注解,可以把处理 @preauth 注解的相关代码,直接在 DemoVerifier.verifyAccess 方法内动态调,至于权限的配置,要么代码里写,要么就是你现在加字段的做法。

TommyLemon commented 3 months ago

不过 APIJSON 默认 增、删、改 是要在 Request 表里配置对应的 JSON 结构,里面就必须指定涉及的表,以及对应的 tag 和 version,其实这个就可以具体知道有哪些表,给每个对应请求一一指定 @PreAuth 对应的配置了,不过只要不一个个单独写接口,那仍然不能用注解形式,可以在 Request 表加字段。

csx-bill commented 3 months ago

apijson-router

因为是使用 apijson-router ,每个crud 都是单独的接口,所以我只想到在 document 表增加了一个字段,存储这个权限,然后根据请求地址,校验这个接口权限

TommyLemon commented 3 months ago

对,是通过一个万能通用接口虚拟出来千变万化的单独“接口”,但注解参数只能是常量,编译运行后就不能变了。 目前 Document 表里加权限字段应该是你这个需求的最优解

csx-bill commented 3 months ago

对,是通过一个万能通用接口虚拟出来千变万化的单独“接口”,但注解参数只能是常量,编译运行后就不能变了。 目前 Document 表里加权限字段应该是你这个需求的最优解

突然又想到一个方案,就是把tag 作为接口权限,就可以动态校验了, "online:tag" tag 是动态的

TommyLemon commented 3 months ago

tag 值在万能通用接口里也不是固定的,所以是一样的问题,要么就对应每个 tag 都单独写一个接口,要有对应的注解,内部则转发调用万能通用接口对应方法:

@PreAuth("online:User")
@PostMapping("/get/User")
public String getUser(@RequestBody body) {
   return getByTag("User", body); // 或 return crudByTag(RequestMethod.GET, "User", body);
}

@PreAuth("online:Comment")
@PostMapping("/post/Comment")
public String postComment(@RequestBody body) {
   return postByTag("Comment", body); // 或 return crudByTag(RequestMethod.POST, "Comment", body);
}

要么还是把静态的注解代码改成动态表字段数据配置等形式使用

TommyLemon commented 3 months ago

或者如果处理注解也可以类似 @PostMapping("{method}/{tag}") // 目前这个实测可行,所以只要解析注解 @PreAuth 同样处理即可 这样写变量形式: @PreAuth("{method}/{tag}") 从参数中动态读取 method 和 tag 的值,那也可以一个接口处理所有 method 及 tag 对应的权限

csx-bill commented 3 months ago

或者如果处理注解也可以类似 @PostMapping("{method}/{tag}") // 目前这个实测可行,所以只要解析注解 @preauth 同样处理即可 这样写变量形式: @preauth("{method}/{tag}") 从参数中动态读取 method 和 tag 的值,那也可以一个接口处理所有 method 及 tag 对应的权限

对,我刚刚想到也是这个方案