权限与 SQL 白名单
有两层,管的事情不一样。
能不能打开这个菜单,由角色和菜单决定。打不开页面,就走不进下面这一层。
打开之后能看哪些列、改哪些字段、点哪些按钮,由页内三张权限表决定。同一页上,不同角色可以不一样。
SQL 白名单
打开内置页时,后端扫描页面 JSON,把出现过的 sql_id 放进会话,键是 page:{页面 id}。之后每次 /sql/run 带 X-Page-Id,不在名单里就拒绝。
扩展页读 index.json 的 sql_ids,键是 ext:{html 路径}。请求要带 X-User-Ext-Entry。必须先打开那个 HTML,直接调接口会被拒绝。
弹窗子页要同时满足两点:父页 JSON 的 SubPages 里有它的 id,打开时带 from_page。否则子页自己的 SQL 全部 403。
开发角色(role_id 为 3)可以用 X-User-Id 模拟别人,也可以绕过 SQL 白名单。用开发账号看到的结果,不能当成普通用户的结果。
页内三张表
| 表 | 管什么 | 能控制的属性 |
|---|---|---|
sys.page_column_auth | 表格列 | visible、allowEditing |
sys.page_form_field_auth | 表单字段 | visible、allowEditing、readOnly |
sys.page_action_auth | 按钮 | 可见、可用 |
每张表有一张角色对照表,val 只有两种:1 明确允许,-1 明确禁止。没有行,就继承该规则的 base_value。
page_id 是被配置的那一页业务页,不是配置页自己的 id。
按钮名用现在的大写名字,例如 Save、AddRow、MainSelect。页面 JSON 里写了 "js:" 的权限表达式,由页面自己算,配置页不参与。
列如果 visible: false 但权限或表达式还要用它的值,列上必须写 KeepData: true。见 页面 JSON。