@fxxkgw #1
把接口 uri 提取存到一个表,然后把每个 uri 和用户关联起来
我碰到的就是这个特别特别烦,每次加N个接口后,就要操作一遍这种把每个具体接口都录入数据库表,然后再手动把接口与角色关联数据一条一条存入数据库,现在想到的是通过个性化定制“控制台页面”,然后在定制时通过接口与正则匹配来判断接口是否被允许,比如一个“控制台页面数据”用json文件来保存:
dashboard.json
[
{
"name":"客服控制台页面",
"html":"<ol><li><a>工单管理</a></li><li><a>客户管理</a></li></ol>",
"allowedApis":[
{
"uri":"/customers/.*",
"method":"POST"
},
{
"uri":"/orders",
"method":"GET"
}
]
}
]
1
fxxkgw 2018-09-22 11:24:39 +08:00 via iPhone
把接口 uri 提取存到一个表,然后把每个 uri 和用户关联起来,这个叫授权。
请求时候通过中间件拦截用户请求,通过 session 拿到用户名,判断用户和 uri 是否在数据库里有关联,有则放行,无则返回权限不够。 |
2
fxxkgw 2018-09-22 11:27:31 +08:00 via iPhone
上面有误,应该是把 uri 和组或者角色关联,用户放在组或角色表里。
|
3
iwtbauh 2018-09-22 11:35:17 +08:00 via Android
我直接映射到 Unix 系统用户和数据库用户上,完全不用自己操心
|
4
mmdsun 2018-09-22 11:37:17 +08:00 via Android
前后端分类? html 的显示的按钮菜单都是登录后返回的权限 code 显示的。接口用注解+拦截器控制接口访问。或者用 shiro,spring security 框架。
|
5
aristotll 2018-09-22 11:45:59 +08:00
spring security role
|
6
UIXX 2018-09-22 11:46:06 +08:00
你说得没错,你前面叙述的情况是把“可视”不当作基本权限处理。后面的是把“可视”跟“可读”、“可编辑”等权限结合使用。后者更好。
|
7
xuanbg 2018-09-22 13:02:17 +08:00
服务端缓存一个和用户 Token 对应的数据结构,这个数据里面包含用户登录时得到的权限(一堆的 url)。在用户访问接口的时候,通过网关去判断当前用户访问的 url 在不在缓存的 url 列表里面,有就放行,没有返回未授权。
|
8
honeycomb 2018-09-23 09:55:58 +08:00 via Android
spring security/shiro
|
9
ebingtel 2018-09-23 13:00:14 +08:00
数据权限和接口权限分开……数据库里面不要存 url,应该存 url 对应的 endpoint
|
11
DavidNineRoc 2018-09-25 15:22:04 +08:00 1
memus
id name parent_id 1 客服控制台页面 2 工单管理 1 3 客户管理 1 users(单角色,多角色也差不多) id name role_id 1 david 1 2 gps 2 roles id name 1 admin 2 guest permissions id url method action menu_id 1 /customers get R 3 2 /customers post C 3 3 /customers patch U 3 4 /orders post R 2 role_permission role_id permission_id 1 1 1 2 1 3 // 实际菜单根据用户拥有的 menus 渲染。当用户点击菜单才渲染权限 // 如果点了客户管理前端会传 menu_id = 3 这时候得到 permission=1,2,3 这三条记录,就知道这个页面有这三个权限,然后通过当前登录用户,角色,权限关联。 这时候如果是 david 用户在 /customers 页面就有 CUR 权限 而 gps 用户在 /customers 页面没有任何权限,这都只是给前端显示的 // 而后端需要再建一个中间件验证权限,用户请求,根据页面的 url 和 method 得到唯一的 permission, 如果为 null,代表当前 url 不用验证权限,如果有记录,判断用户是否有这个权限,没有抛出异常,有,请求就通过 |