Flask 学习 - 用户请求权限判断

本文介绍如何在FlaskWeb应用中实现用户权限管理,通过定义权限类型和使用自定义过滤器,确保用户请求操作符合其权限级别,防止未授权访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flask Web开发:基于Python的Web应用开发实战(第2版) 学习笔记-用户权限判断

关于用户权限的判断

该功能用于判断用户相关请求操作是否有足够权限执行,如权限不够则返回403报错

定义权限类型

models.py

class Permission: # 包含 关注 备注等权限
    FOLLOW = 1
    COMMENT = 2
    WRITE = 4
    MODERATE = 8
    ADMIN = 16

添加User model 权限属性 及相关操作

class User():
	...
	permissions = db.Column(db.Integer)
	
	def has_permission(self,permission):
		return self.permissions & permission == permission

自定义过滤器

decorators

from functools import wraps
from flask import abort
from flask_login import current_user
from .models import Permission
def permission_required(permission):
	def decorator(f):
		@wraps(f)
		def decorated_function(*args, **kwargs):
			if not current_user.can(permission):
			abort(403)
			return f(*args, **kwargs)
		return decorated_function
	return decorator
def admin_required(f):
return permission_required(Permission.ADMIN)(f)

Demo

#!/usr/bin/env python
# _*_coding:utf-8 _*_
# @Time    :2020/8/7 7:50
# @Author  :Coco
# @FileName: temp.py

# @Software: PyCharm
"""
# code is far away from bugs with the god animal protecting
    I love animals. They taste delicious.
              ┏┓ ┏┓
            ┏┛┻━┛┻━┓
            ┃   ☃  ┃
            ┃ ┳┛ ┗┳ ┃
            ┃   ┻   ┃
            ┗━┓   ┏━┛
               ┃     ┗━━┓
               ┃        ┣┓
               ┃       ┏┛
               ┗┓┓━━┳┓━┛
                 ┃┫  ┃┫
                 ┗┛  ┗┛
"""
from functools import wraps


class User():
    '''
    模拟定语用户类 创建时需给定名称以及权限级别
    '''
    def __init__(self, name, per):
        self.name = name
        self.per = per

    def has_permission(self, permission):
        '''
        判断此用户是否有足够权限
        :param permission: 给你需要判断的权限等级
        :return: 布尔值
        '''
        return self.per & permission == permission


class Permission:
    '''
    定语5中权限级别
    '''
    FOLLOW = 1
    COMMENT = 2
    WRITE = 4
    MODERATE = 8
    ADMIN = 16


# 实例化user 类 模拟请求中的current_user 此处我们给的是ADMIN 即最高权限
user = User('coco', 1+2+4+8+16)


def permission_required(permission):
    # 传入方法需要的权限等级
    def decorator(f):
        # 交互中请求的方法 在路由中定义的相关方法
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not user.has_permission(permission):
                # 判断该用户是否存在此权限 此处传参即为我们想要定义的权限级别
                # 例 该装饰器装饰的是 index 方法 传参为Permission.ADMIN 表示 只有ADMIN 权限才能访问index
                print('你并没有权限完成此操作')
                raise Exception('操作权限,退出')
                # abort(403) flask 中应用abort处理权限不够的情况
            return f(*args, **kwargs)

        return decorated_function

    return decorator


def admin_required(f):
    # 判断是否有admin权限
    return permission_required(Permission.ADMIN)(f)


@admin_required
def for_admin_only():
    return 'For administrators'


# 此处给定的COMMENT 表示为for_moderators_only 方式至少需要COMMENT才能使用
@permission_required(Permission.COMMENT)
def for_moderators_only():
    return 'For comment moderators!'

Demo执行情况如下

print(for_moderators_only())

For comment moderators! 因为User权限为最高权限,所以请求成功

print(for_admin_only())

For administrators 因为User权限为最高权限,所以请求成功

此时我们修改use权限以为 为Follow

user = User('coco',1)
...
print(for_moderators_only())

你并没有权限完成此操作
Traceback (most recent call last):
File “E:/MeiTianYiTi/temp.py”, line 94, in
print(for_moderators_only())
File “E:/MeiTianYiTi/temp.py”, line 69, in decorated_function
raise Exception(‘操作权限,退出’)
Exception: 操作权限,退出

print(for_admin_only())

Traceback (most recent call last):
File “E:/MeiTianYiTi/temp.py”, line 96, in
print(for_admin_only())
File “E:/MeiTianYiTi/temp.py”, line 69, in decorated_function
raise Exception(‘操作权限,退出’)
Exception: 操作权限,退出
你并没有权限完成此操作

此时因为FOLLOW 权限级别不够 COMMENT以及ADMIN 所以两次请求均报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值