Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
csx-bill opened this issue Jun 2, 2024 · 10 comments
Open

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

csx-bill opened this issue Jun 2, 2024 · 10 comments

Comments

@csx-bill
Copy link
Contributor

csx-bill commented Jun 2, 2024

Description

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

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

@TommyLemon
Copy link
Collaborator

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

@csx-bill
Copy link
Contributor Author

csx-bill commented Jun 4, 2024

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

每个接口都新增接口?

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

@TommyLemon
Copy link
Collaborator

TommyLemon commented Jun 4, 2024

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

@TommyLemon
Copy link
Collaborator

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

@csx-bill
Copy link
Contributor Author

csx-bill commented Jun 4, 2024

apijson-router

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

@TommyLemon
Copy link
Collaborator

TommyLemon commented Jun 4, 2024

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

@csx-bill
Copy link
Contributor Author

csx-bill commented Jun 4, 2024

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

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

@TommyLemon
Copy link
Collaborator

TommyLemon commented Jun 4, 2024

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
Copy link
Collaborator

TommyLemon commented Jun 4, 2024

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

@csx-bill
Copy link
Contributor Author

csx-bill commented Jun 4, 2024

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants