Files
java-template/utils/health_processing/auth_manager.py
T

190 lines
6.2 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
认证管理器
处理ljwx-boot系统的登录认证
@Author: bruno.gao <[email protected]>
@ProjectName: ljwx-boot
@CreateTime: 2025-01-26
"""
import requests
import json
import logging
import time
from datetime import datetime, timedelta
from typing import Dict, Optional
class AuthManager:
"""认证管理器"""
def __init__(self, auth_url: str, username: str, password: str, timeout: int = 30):
self.auth_url = auth_url
self.username = username
self.password = password
self.timeout = timeout
self.token = None
self.token_expires = None
self.session = requests.Session()
# 设置日志
self.logger = logging.getLogger(f"{__name__}.AuthManager")
def login(self) -> bool:
"""执行登录获取token"""
try:
self.logger.info(f"🔐 开始登录认证: {self.auth_url}")
login_data = {
"userName": self.username,
"password": self.password
}
response = self.session.post(
self.auth_url,
json=login_data,
timeout=self.timeout,
headers={'Content-Type': 'application/json'}
)
self.logger.debug(f"登录请求状态码: {response.status_code}")
self.logger.debug(f"登录响应头: {dict(response.headers)}")
response.raise_for_status()
result = response.json()
self.logger.debug(f"登录响应内容: {result}")
if result.get('code') == 200:
data = result.get('data', {})
self.token = data.get('token') or data.get('accessToken')
if self.token:
# 设置token过期时间(默认2小时)
self.token_expires = datetime.now() + timedelta(hours=2)
# 更新session的Authorization头
self.session.headers.update({
'Authorization': f'Bearer {self.token}'
})
self.logger.info(f"✅ 登录成功,token已获取")
self.logger.debug(f"Token: {self.token[:20]}...")
return True
else:
self.logger.error(f"❌ 登录响应中未找到token: {result}")
return False
else:
error_msg = result.get('message') or result.get('msg', 'Unknown error')
self.logger.error(f"❌ 登录失败: {error_msg}")
return False
except requests.exceptions.RequestException as e:
self.logger.error(f"❌ 登录请求失败: {str(e)}")
return False
except json.JSONDecodeError as e:
self.logger.error(f"❌ 登录响应解析失败: {str(e)}")
self.logger.debug(f"响应内容: {response.text if 'response' in locals() else 'N/A'}")
return False
except Exception as e:
self.logger.error(f"❌ 登录过程异常: {str(e)}")
return False
def is_token_valid(self) -> bool:
"""检查token是否有效"""
if not self.token:
return False
if not self.token_expires:
return True # 如果没有设置过期时间,假设有效
return datetime.now() < self.token_expires
def ensure_authenticated(self) -> bool:
"""确保已认证,如果token过期则重新登录"""
if self.is_token_valid():
self.logger.debug("✅ Token仍然有效")
return True
self.logger.info("🔄 Token已过期或不存在,重新登录")
return self.login()
def get_authenticated_session(self) -> Optional[requests.Session]:
"""获取已认证的session"""
if self.ensure_authenticated():
return self.session
return None
def get_token(self) -> Optional[str]:
"""获取当前有效的token"""
if self.ensure_authenticated():
return self.token
return None
def logout(self):
"""登出(清理本地认证信息)"""
self.token = None
self.token_expires = None
if 'Authorization' in self.session.headers:
del self.session.headers['Authorization']
self.logger.info("🔓 已登出,认证信息已清理")
def create_auth_manager(config: Dict) -> Optional[AuthManager]:
"""从配置创建认证管理器"""
ljwx_config = config.get('ljwx_boot', {})
auth_url = ljwx_config.get('auth_url')
username = ljwx_config.get('username')
password = ljwx_config.get('password')
timeout = ljwx_config.get('timeout', 30)
if not all([auth_url, username, password]):
logging.getLogger(__name__).warning("⚠️ 认证配置不完整,跳过认证")
return None
return AuthManager(auth_url, username, password, timeout)
def test_auth_manager():
"""测试认证管理器"""
import json
# 加载配置
try:
with open('health_processing_config.json', 'r', encoding='utf-8') as f:
config = json.load(f)
except Exception as e:
print(f"❌ 无法加载配置文件: {e}")
return False
# 设置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# 创建认证管理器
auth_manager = create_auth_manager(config)
if not auth_manager:
print("❌ 无法创建认证管理器")
return False
# 测试登录
if auth_manager.login():
print("✅ 认证测试成功")
print(f"Token: {auth_manager.get_token()[:20]}...")
# 测试获取已认证的session
session = auth_manager.get_authenticated_session()
if session:
print("✅ 已认证的session获取成功")
auth_manager.logout()
return True
else:
print("❌ 认证测试失败")
return False
if __name__ == "__main__":
test_auth_manager()