函数表达式不直接装载加密策略,而是作为动态分发机制核心,在运行时根据用户权限返回对应加密函数引用,实现按需绑定;策略封装为独立无状态函数,通过策略选择器、装饰器和可热插拔映射表统一管理。

函数表达式本身不直接“装载”加密策略,但它可以作为动态分发机制的核心——在运行时根据当前用户权限,返回对应加密函数的引用,从而实现策略的即时切换。关键不在“装载”二字,而在于“按需绑定”。
把加密逻辑封装成可调用对象
先别急着写if-else分支,而是把每种加密策略写成独立、无状态的函数:
- basic_encrypt(data):使用base64简单编码,适用于公开数据
- aes_encrypt(data, key):AES-256加密,需密钥,用于敏感字段
- hsm_encrypt(data):调用硬件安全模块接口,仅限管理员调用
这些函数保持职责单一,不依赖全局状态,便于测试和替换。
用函数表达式做权限路由
定义一个策略选择器,它不是执行加密,而是返回一个加密函数:
def get_encryptor(user_role):
return {
'guest': basic_encrypt,
'user': lambda d: aes_encrypt(d, get_user_key()),
'admin': hsm_encrypt
}.get(user_role, basic_encrypt)
注意:这里没有提前执行加密,只是返回函数对象。调用时才真正执行:
-
encrypt = get_encryptor('user')→ 得到一个带密钥闭包的lambda -
cipher = encrypt('password123')→ 此刻才触发AES加密
结合装饰器统一注入
若多个函数需要按权限自动选加密策略,可用装饰器封装上述逻辑:
def with_dynamic_encryption(func):
def wrapper(*args, **kwargs):
user = get_current_user() # 从上下文获取真实用户
encryptor = get_encryptor(user.role)
# 可选:对特定参数(如'password')自动加密
if 'password' in kwargs:
kwargs['password'] = encryptor(kwargs['password'])
return func(*args, **kwargs)
return wrapper
<p>@with_dynamic_encryption
def create_account(username, password):
save_to_db(username, password) # 此处password已是密文
这样业务函数完全不用关心“该用哪种加密”,只管传原始值,策略由运行时决定。
避免硬编码,支持热插拔
策略映射表可从配置加载,甚至支持运行时注册:
_ENCRYPTORS = {'guest': basic_encrypt}
<p>def register_encryptor(role, func):
_ENCRYPTORS[role] = func</p><h1>后续可动态启用新策略,无需重启</h1><p>register_encryptor('auditor', custom_audit_encrypt)
只要get_encryptor()查表时读取的是同一字典,新策略立刻生效。

















