在实际开发过程中,面对一个需求,我们往往不缺“可行方案”,而是缺少“最合适的落地方案”。本篇文章将从一个典型的实际场景出发——Web系统的权限管理模块,来讲解在实战中如何进行有效的方案选型,并最终稳定落地。
某企业开发一套B端管理后台,功能复杂,角色众多,权限需求如下:
此时面临的第一个问题是:权限控制到底用哪种模型?RBAC(基于角色的访问控制)还是 ABAC(基于属性的访问控制)?
模型 | 描述 | 适用场景 |
|---|---|---|
RBAC | 用户 -> 角色 -> 权限 | 通用,逻辑清晰 |
ABAC | 根据用户、资源、环境属性动态计算 | 更灵活,适合复杂企业级权限 |
ACL | 每个资源维护权限列表 | 小系统,精细粒度,但不易维护 |
对于本场景,**RBAC + 可扩展的属性过滤(模拟ABAC)**是折中的选择。
我们来进行实战评估,定义几个评估维度:
经过分析:
方案 | 复杂度 | 灵活性 | 性能 | 可配置性 |
|---|---|---|---|---|
纯RBAC | ★☆☆☆☆ | ★★☆☆☆ | ★★★★★ | ★★☆☆☆ |
纯ABAC | ★★★★☆ | ★★★★★ | ★★☆☆☆ | ★★★★★ |
RBAC + 属性过滤 | ★★☆☆☆ | ★★★★☆ | ★★★★☆ | ★★★★☆ |
最终选择 RBAC + 属性过滤。
# 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)# 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# 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()query_filter 工厂方法封装。方案选型不是单纯的技术判断,更是一个多维度权衡与落地预判的过程。本文从权限控制为例,通过模型对比、选型分析、代码实战与落地建议,演示了一个完整的选型闭环流程。希望能为你的项目决策提供实用参考。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。