当在项目中多个模块都生成token时,缓存中的token可以保证在同一个时空内不重复(因为uuid不会重复。token = uuid.uuid4().hex)但是cache中的KEY是有可能重复的,因为id都是从1开始的。例如:同一个项目中,有后管理用户和影院用户,其user_id都是从1开始的生成,当user_id = cathe.get(token)时,有可能可以用影院用户的token执行后台管理员用户的权限,造成token冲突
解决方法:给token添加前缀
建立一个工具包如utils
例:
import uuid
ADMIN = 'admin'
CINEMA = 'cinema'
VIEWER = 'viewer'
def generrate_token(prefix):
token = uuid.uuid4().hex
return prefix + token
def generrate_admin_token():
return generrate_token(ADMIN)
def generrate_cinema_token():
return generrate_token(CINEMA)
def generrate_viewer_token():
return generrate_token(VIEWER)
调用生成token时:
token = generrate_admin_token()
认证token时:
token = request.query_params.get('token')
if not token .startswith('ADMIN'): # 验证的是前缀是ADMIN=‘admin’的token
raise Exception('错误的操作')
user_id = cache.get(token)
....