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 所以两次请求均报错