Python中如何进行Web开发的权限管理

楼主目前使用的是 python falsk 做后端开发,使用了 RBAC 架构作为权限管理。

但是我有以下疑问:
1.在查找该用户是否具有权限的时候,采用的方式是:查找用户角色 -> 用户角色对应的权限表 -> 查找该用户是否具备此权限 这样设计合理吗?
2.如果我要限制用户可以查看多少页的数据(如分为 50 页,100 页),在权限表中是应该设置一个具体的数字,还是直接设定不可更改的一个权限标示就足够
3.对于像腾讯云这样的网站,所用的定制权限(如使用的机器内存大小,这个难道是购买之后就直接固定了吗?),如果我想通过购买来确定权限,应该如何做

能给个合理建议吗?谢谢
Python中如何进行Web开发的权限管理


12 回复

基于资源的权限控制更加灵活.


在Python Web开发中,权限管理通常通过中间件、装饰器和权限系统来实现。核心思路是:在请求处理前验证用户是否有权访问特定资源。

以Flask为例,一个简单的基于角色的权限管理可以这样实现:

from flask import Flask, request, abort
from functools import wraps

app = Flask(__name__)

# 模拟用户数据库
users = {
    'user1': {'role': 'admin'},
    'user2': {'role': 'user'}
}

# 权限装饰器
def require_role(role):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            # 从请求头获取用户信息(实际中应该用token验证)
            username = request.headers.get('X-Username')
            if not username or users.get(username, {}).get('role') != role:
                abort(403)  # 禁止访问
            return f(*args, **kwargs)
        return decorated_function
    return decorator

[@app](/user/app).route('/admin')
@require_role('admin')
def admin_page():
    return '管理员页面'

[@app](/user/app).route('/user')
@require_role('user')
def user_page():
    return '普通用户页面'

if __name__ == '__main__':
    app.run(debug=True)

对于更复杂的系统,推荐使用现成的权限框架:

  1. Django:内置强大的权限系统

    # Django视图权限控制
    from django.contrib.auth.decorators import permission_required
    
    [@permission_required](/user/permission_required)('app.can_view')
    def my_view(request):
        # 只有有权限的用户才能访问
        pass
    
  2. Flask-Security:为Flask提供完整的权限管理

    from flask_security import roles_required
    
    [@app](/user/app).route('/admin')
    [@roles_required](/user/roles_required)('admin')
    def admin():
        return '管理员区域'
    
  3. FastAPI:使用依赖注入实现权限控制

    from fastapi import Depends, HTTPException
    
    async def check_admin(token: str = Header(...)):
        if not validate_admin_token(token):
            raise HTTPException(status_code=403)
        return True
    
    [@app](/user/app).get("/admin")
    async def admin_area(admin: bool = Depends(check_admin)):
        return {"message": "欢迎管理员"}
    

关键实现要点:

  • 用户认证(Authentication):验证用户身份
  • 权限验证(Authorization):检查用户是否有权执行操作
  • 角色(Roles)和权限(Permissions)分离设计
  • 中间件统一处理权限验证

对于生产环境,建议结合JWT或OAuth2实现无状态认证,并将权限信息存储在数据库中以便动态管理。

总结:根据项目复杂度选择合适的权限方案。

谢谢,有教程或者开源项目作为参考吗?

基于资源的权限控制和基于角色的权限控制的主要区别在于:是否显式的表达出某个角色对于某个资源有某个操作的权限。优点体现在需求变更时的需要改动的代码更少

这是我的一点总结: https://www.myway5.com/index.php/2018/03/29/%E7%B3%BB%E7%BB%9F%E6%9D%83%E9%99%90%E8%AE%BE%E8%AE%A1%E4%B8%ADrbac%E6%A8%A1%E5%9E%8B%E7%9A%84%E4%BD%BF%E7%94%A8/

我觉得 rbac 挺好的。

谢谢,但是对于一个网站的权限(例如可查的页数)我在权限表里面应该插入不同的行吗?在这行中我是应该明确的表示 1000 页和用户查看的页数进行大小比较,还是只是一个权限设定(如有这个权限才能看 1000 页以上,如果是这样的话,对于比 1000 页小的权限限制(如 100 页),那就需要将两个权限都加入权限池,这样做是否优雅)

rbac 在很多场景下就是个鸡肋,不能彻底解决较为复杂的权限问题,比如同一个资源,A 能 CURD,B 仅能 CU 的场景

我个人是觉得“应该明确的表示 1000 页和用户查看的页数进行大小比较”这种方案会比较好,因为在这个限定发生改变时,代码改动最小

将 50 页,100 页存为 2 条权限,然后在用户请求的时候检查一下就行了

用户和权限之间还可以再加一个用户组,默认用户组有默认权限这样

其实这也在我的疑问中。因为我是加了用户组的(如超级管理员等),但是根据一些不错的博客(如 ),最后还是通过 直接查找是否拥有这项权限 来确定是否返回数据。当然,我认为加了用户组之后管理权限要方便的多,直接赋予角色就行

auth 授权了解一下 RBAC 都是很老的产物了
如果我要一级管理员显示某个按钮 二级管理员不显示 RBAC 就做不到了

回到顶部