首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于实战的方案选型策略:以Web系统权限设计为例

基于实战的方案选型策略:以Web系统权限设计为例

原创
作者头像
百行代码
发布2025-05-07 00:09:17
发布2025-05-07 00:09:17
8970
举报
文章被收录于专栏:技术汇总专栏技术汇总专栏

基于实战的方案选型策略:以Web系统权限设计为例

在实际开发过程中,面对一个需求,我们往往不缺“可行方案”,而是缺少“最合适的落地方案”。本篇文章将从一个典型的实际场景出发——Web系统的权限管理模块,来讲解在实战中如何进行有效的方案选型,并最终稳定落地。


一、场景背景

某企业开发一套B端管理后台,功能复杂,角色众多,权限需求如下:

  • 角色权限:支持不同角色拥有不同功能权限;
  • 数据权限:如销售只能查看自己区域的数据;
  • 可配置化:需要支持后期动态配置角色权限。

此时面临的第一个问题是:权限控制到底用哪种模型?RBAC(基于角色的访问控制)还是 ABAC(基于属性的访问控制)?


二、常见权限控制模型概述

模型

描述

适用场景

RBAC

用户 -> 角色 -> 权限

通用,逻辑清晰

ABAC

根据用户、资源、环境属性动态计算

更灵活,适合复杂企业级权限

ACL

每个资源维护权限列表

小系统,精细粒度,但不易维护

对于本场景,**RBAC + 可扩展的属性过滤(模拟ABAC)**是折中的选择。


三、实战方案选型分析

我们来进行实战评估,定义几个评估维度:

  1. 复杂度:是否容易理解和维护?
  2. 灵活性:能否支持未来权限模型变更?
  3. 性能:是否对性能有明显影响?
  4. 可配置性:是否支持后台灵活管理?

经过分析:

方案

复杂度

灵活性

性能

可配置性

纯RBAC

★☆☆☆☆

★★☆☆☆

★★★★★

★★☆☆☆

纯ABAC

★★★★☆

★★★★★

★★☆☆☆

★★★★★

RBAC + 属性过滤

★★☆☆☆

★★★★☆

★★★★☆

★★★★☆

最终选择 RBAC + 属性过滤


四、方案落地:代码实现(基于Python FastAPI)

1. 权限模型设计

代码语言:python
复制
# models.py
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String)
    role_id = Column(Integer, ForeignKey('roles.id'))

class Role(Base):
    __tablename__ = 'roles'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    permissions = relationship('Permission', secondary='role_permissions')

class Permission(Base):
    __tablename__ = 'permissions'
    id = Column(Integer, primary_key=True)
    endpoint = Column(String)  # 如 /data/view
    action = Column(String)    # 如 GET

class RolePermission(Base):
    __tablename__ = 'role_permissions'
    role_id = Column(Integer, ForeignKey('roles.id'), primary_key=True)
    permission_id = Column(Integer, ForeignKey('permissions.id'), primary_key=True)

2. 权限检查中间件

代码语言:python
复制
# auth.py
from fastapi import Request, HTTPException
from starlette.middleware.base import BaseHTTPMiddleware

class PermissionMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next):
        user = get_user_from_token(request)
        if not has_permission(user, request.url.path, request.method):
            raise HTTPException(status_code=403, detail="Permission denied")
        return await call_next(request)

def has_permission(user, path, method):
    for perm in user.role.permissions:
        if perm.endpoint == path and perm.action == method:
            return True
    return False

3. 可扩展的数据权限过滤(模拟ABAC)

代码语言:python
复制
# data_service.py
def get_sales_data(user):
    query = db.query(SalesData)
    if user.role.name == "Sales":
        query = query.filter(SalesData.region == user.region)
    return query.all()

五、落地与优化建议

  • 权限动态管理:可配后台页面添加/删除权限;
  • 接口自动注册权限:结合 OpenAPI 自动同步接口信息;
  • 数据过滤层统一管理:如通过 SQLAlchemy 的 query_filter 工厂方法封装。

六、总结

方案选型不是单纯的技术判断,更是一个多维度权衡与落地预判的过程。本文从权限控制为例,通过模型对比、选型分析、代码实战与落地建议,演示了一个完整的选型闭环流程。希望能为你的项目决策提供实用参考。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 基于实战的方案选型策略:以Web系统权限设计为例
    • 一、场景背景
    • 二、常见权限控制模型概述
    • 三、实战方案选型分析
    • 四、方案落地:代码实现(基于Python FastAPI)
      • 1. 权限模型设计
      • 2. 权限检查中间件
      • 3. 可扩展的数据权限过滤(模拟ABAC)
    • 五、落地与优化建议
    • 六、总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档