P2-2: 创建 packages/application/auth/password_handler.py 委托层,隔离 Domain 层对 bcrypt 库的依赖
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
"""
|
||||
密码处理器委托层
|
||||
|
||||
此模块作为 Domain 层 (packages.domain.auth.password_hasher) 和 Application 层之间的委托层,
|
||||
隔离 Domain 层对 bcrypt 库的直接依赖。
|
||||
|
||||
使用方式:
|
||||
from packages.application.auth.password_handler import PasswordHandler, get_password_handler
|
||||
|
||||
password_handler = PasswordHandler()
|
||||
hashed = password_handler.hash_password("my_secure_password")
|
||||
is_valid = password_handler.verify_password("my_secure_password", hashed)
|
||||
"""
|
||||
|
||||
from typing import Optional, Tuple
|
||||
|
||||
from packages.domain.auth.password_hasher import PasswordHasher, PasswordValidator
|
||||
|
||||
|
||||
class PasswordHandler:
|
||||
"""
|
||||
密码处理器委托类
|
||||
|
||||
委托给 packages.domain.auth.password_hasher 进行实际的密码哈希操作,
|
||||
此层仅负责配置和封装,不直接依赖 bcrypt 库。
|
||||
"""
|
||||
|
||||
def __init__(self, rounds: int = 12):
|
||||
"""
|
||||
初始化密码处理器
|
||||
|
||||
Args:
|
||||
rounds: bcrypt cost factor(默认 12,推荐范围 10-14)
|
||||
"""
|
||||
self._hasher = PasswordHasher(rounds=rounds)
|
||||
self._validator = PasswordValidator(
|
||||
min_length=8,
|
||||
require_uppercase=True,
|
||||
require_lowercase=True,
|
||||
require_digit=True,
|
||||
require_special=False,
|
||||
)
|
||||
|
||||
def hash_password(self, password: str) -> str:
|
||||
"""
|
||||
哈希密码
|
||||
|
||||
Args:
|
||||
password: 明文密码
|
||||
|
||||
Returns:
|
||||
bcrypt 哈希字符串
|
||||
|
||||
Raises:
|
||||
ValueError: 密码为空
|
||||
"""
|
||||
return self._hasher.hash_password(password)
|
||||
|
||||
def verify_password(self, password: str, hashed_password: str) -> bool:
|
||||
"""
|
||||
验证密码
|
||||
|
||||
Args:
|
||||
password: 明文密码
|
||||
hashed_password: 存储的哈希密码
|
||||
|
||||
Returns:
|
||||
True 如果密码正确,否则 False
|
||||
"""
|
||||
return self._hasher.verify_password(password, hashed_password)
|
||||
|
||||
def needs_rehash(self, hashed_password: str) -> bool:
|
||||
"""
|
||||
检查哈希是否需要重新计算
|
||||
|
||||
Args:
|
||||
hashed_password: 存储的哈希密码
|
||||
|
||||
Returns:
|
||||
True 如果需要重新哈希
|
||||
"""
|
||||
return self._hasher.needs_rehash(hashed_password)
|
||||
|
||||
def validate_strength(self, password: str) -> Tuple[bool, Optional[str]]:
|
||||
"""
|
||||
验证密码强度
|
||||
|
||||
Args:
|
||||
password: 明文密码
|
||||
|
||||
Returns:
|
||||
(是否有效, 错误信息)
|
||||
"""
|
||||
return self._validator.validate(password)
|
||||
|
||||
|
||||
# 默认处理器实例
|
||||
_default_handler: Optional[PasswordHandler] = None
|
||||
|
||||
|
||||
def configure_password_handler(rounds: int = 12) -> PasswordHandler:
|
||||
"""
|
||||
配置全局密码处理器
|
||||
|
||||
Args:
|
||||
rounds: bcrypt cost factor
|
||||
|
||||
Returns:
|
||||
配置好的 PasswordHandler 实例
|
||||
"""
|
||||
global _default_handler
|
||||
_default_handler = PasswordHandler(rounds=rounds)
|
||||
return _default_handler
|
||||
|
||||
|
||||
def get_password_handler() -> PasswordHandler:
|
||||
"""
|
||||
获取全局密码处理器
|
||||
|
||||
Returns:
|
||||
PasswordHandler 实例
|
||||
"""
|
||||
global _default_handler
|
||||
if _default_handler is None:
|
||||
_default_handler = PasswordHandler()
|
||||
return _default_handler
|
||||
Reference in New Issue
Block a user