上一篇
按钮权限 数据库设计
- 行业动态
- 2025-05-17
- 1
按钮权限通过角色-权限关联表实现细粒度控制,数据库设计需建立角色表、权限表及中间关联表,字段包含权限ID、按钮标识、操作类型,支持动态配置与
按钮权限数据库设计要点
核心设计思路
- 权限粒度控制:以按钮为最小权限单位,支持可见性、可操作性(点击/禁用)等状态控制。
- 角色关联机制:通过角色绑定权限,实现用户与权限的间接关联。
- 动态扩展性:支持新增按钮、操作类型时无需修改数据库结构。
数据表结构设计
表名 | 字段说明 | 数据类型 | 备注 |
---|---|---|---|
users | 用户信息表 | id (主键)username password | 存储系统用户 |
roles | 角色信息表 | id (主键)role_name | 存储角色名称(如管理员、普通用户) |
permissions | 按钮权限表 | id (主键)button_id action_type state | 定义按钮的操作权限状态 |
user_roles | 用户角色关联表 | user_id role_id | 多对多关系映射 |
role_permissions | 角色权限关联表 | role_id permission_id | 多对多关系映射 |
字段详细说明
permissions
表button_id
: 按钮唯一标识(如order_create
)action_type
: 操作类型(枚举:view
/click
/disable
)state
: 权限状态(allow
/deny
)
扩展字段建议
description
: 权限描述(如“允许查看订单创建按钮”)module
: 所属功能模块(如“订单管理”)
示例数据
角色与权限配置
| 角色 | 权限列表(button_id + action_type) |
|————-|——————————————————–|
| 管理员 | order_create.click=allow
order_delete.click=allow
|
| 普通用户 | order_create.view=allow
order_delete.view=deny
|
数据库表数据示例
| 表名 | 示例数据 |
|————|—————————————–|
| roles
| id=1, role_name=admin
id=2, role_name=user
|
| permissions
| id=1, button_id=order_create, action_type=click, state=allow
id=2, button_id=order_delete, action_type=click, state=allow
|
| role_permissions
| role_id=1, permission_id=1
role_id=1, permission_id=2
role_id=2, permission_id=1
|
查询逻辑
-查询用户所有权限 SELECT p. FROM users u JOIN user_roles ur ON u.id = ur.user_id JOIN role_permissions rp ON ur.role_id = rp.role_id JOIN permissions p ON rp.permission_id = p.id WHERE u.username = 'test_user';
前端应用逻辑
权限合并规则:
- 若同一按钮存在多个权限配置,采用 拒绝优先 原则(
deny
覆盖allow
)。 - 示例:用户同时拥有
order_create.view=allow
和order_create.view=deny
→ 最终权限为deny
。
- 若同一按钮存在多个权限配置,采用 拒绝优先 原则(
动态渲染按钮:
- 根据返回的权限数据,控制按钮的
display
和disabled
属性。
- 根据返回的权限数据,控制按钮的
相关问题与解答
问题1:如何动态生成按钮的前端组件?
解答:
- 后端返回用户权限数据(如
{ order_create: { view: true, click: false } }
)。 - 前端遍历权限对象,动态渲染按钮:
view=true
→ 显示按钮click=false
→ 按钮禁用(disabled
属性)
- 示例代码(React):
const renderButton = (buttonId, permissions) => { const { view, click } = permissions[buttonId] || { view: false, click: false }; return view ? ( <Button disabled={!click}>{buttonId}</Button> ) : null; };
问题2:多个角色权限冲突如何处理?
解答:
- 策略选择:
- 严格模式:只要任一角色禁止,则最终禁止(安全性高)。
- 宽松模式:只要任一角色允许,则最终允许(灵活性高)。
- 实现示例(严格模式):
SELECT button_id, action_type, MIN(CASE WHEN state = 'deny' THEN 1 ELSE 0 END) AS final_state FROM role_permissions rp JOIN permissions p ON rp.permission_id = p.id WHERE rp.role_id IN (用户角色列表) GROUP BY button_id, action