skyplatform-iam 1.0.5__py3-none-any.whl → 1.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- skyplatform_iam/__init__.py +73 -69
- skyplatform_iam/config.py +46 -180
- skyplatform_iam/connect_agenterra_iam.py +147 -161
- skyplatform_iam/middleware.py +69 -145
- {skyplatform_iam-1.0.5.dist-info → skyplatform_iam-1.2.0.dist-info}/METADATA +1 -1
- skyplatform_iam-1.2.0.dist-info/RECORD +8 -0
- skyplatform_iam/api.py +0 -366
- skyplatform_iam/global_manager.py +0 -272
- skyplatform_iam-1.0.5.dist-info/RECORD +0 -10
- {skyplatform_iam-1.0.5.dist-info → skyplatform_iam-1.2.0.dist-info}/WHEEL +0 -0
skyplatform_iam/api.py
DELETED
|
@@ -1,366 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
SkyPlatform IAM SDK 统一API模块
|
|
3
|
-
提供统一的初始化和全局访问接口
|
|
4
|
-
"""
|
|
5
|
-
import logging
|
|
6
|
-
from typing import Optional, Dict, Any
|
|
7
|
-
from fastapi import FastAPI, Request
|
|
8
|
-
|
|
9
|
-
from .config import AuthConfig
|
|
10
|
-
from .global_manager import get_global_manager, GlobalIAMManager
|
|
11
|
-
from .connect_agenterra_iam import ConnectAgenterraIam
|
|
12
|
-
from .exceptions import IAMServiceError, ConfigurationError
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def init_skyplatform_iam(
|
|
18
|
-
app: FastAPI,
|
|
19
|
-
config: Optional[AuthConfig] = None,
|
|
20
|
-
**kwargs
|
|
21
|
-
) -> GlobalIAMManager:
|
|
22
|
-
"""
|
|
23
|
-
统一初始化SkyPlatform IAM SDK
|
|
24
|
-
一次配置,全局可用
|
|
25
|
-
|
|
26
|
-
Args:
|
|
27
|
-
app: FastAPI应用实例
|
|
28
|
-
config: 认证配置,如果为None则从环境变量加载
|
|
29
|
-
**kwargs: 额外配置参数
|
|
30
|
-
|
|
31
|
-
Returns:
|
|
32
|
-
GlobalIAMManager: 全局IAM管理器实例
|
|
33
|
-
|
|
34
|
-
Raises:
|
|
35
|
-
ConfigurationError: 配置错误
|
|
36
|
-
IAMServiceError: IAM服务连接错误
|
|
37
|
-
|
|
38
|
-
Example:
|
|
39
|
-
# 方式1:直接配置
|
|
40
|
-
config = AuthConfig(
|
|
41
|
-
agenterra_iam_host="http://127.0.0.1:5001",
|
|
42
|
-
server_name="Agenterra_shop",
|
|
43
|
-
access_key="your_access_key"
|
|
44
|
-
)
|
|
45
|
-
init_skyplatform_iam(app, config)
|
|
46
|
-
|
|
47
|
-
# 方式2:从环境变量加载
|
|
48
|
-
init_skyplatform_iam(app)
|
|
49
|
-
"""
|
|
50
|
-
logger.info("开始初始化SkyPlatform IAM SDK")
|
|
51
|
-
|
|
52
|
-
try:
|
|
53
|
-
# 获取全局管理器
|
|
54
|
-
manager = get_global_manager()
|
|
55
|
-
|
|
56
|
-
# 如果已经初始化,记录警告并返回
|
|
57
|
-
if manager.is_initialized():
|
|
58
|
-
logger.warning("SkyPlatform IAM SDK已经初始化,跳过重复初始化")
|
|
59
|
-
return manager
|
|
60
|
-
|
|
61
|
-
# 处理配置
|
|
62
|
-
if config is None:
|
|
63
|
-
logger.info("未提供配置,从环境变量加载")
|
|
64
|
-
try:
|
|
65
|
-
config = AuthConfig.from_env()
|
|
66
|
-
except Exception as e:
|
|
67
|
-
raise ConfigurationError(f"从环境变量加载配置失败: {str(e)}")
|
|
68
|
-
|
|
69
|
-
# 应用额外配置参数
|
|
70
|
-
if kwargs:
|
|
71
|
-
logger.debug(f"应用额外配置参数: {kwargs}")
|
|
72
|
-
config = config.copy_with_updates(**kwargs)
|
|
73
|
-
|
|
74
|
-
# 初始化管理器
|
|
75
|
-
manager.initialize(app, config)
|
|
76
|
-
|
|
77
|
-
logger.info("SkyPlatform IAM SDK初始化完成")
|
|
78
|
-
return manager
|
|
79
|
-
|
|
80
|
-
except Exception as e:
|
|
81
|
-
logger.error(f"SkyPlatform IAM SDK初始化失败: {str(e)}")
|
|
82
|
-
raise
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
class LazyIAMClient:
|
|
86
|
-
"""
|
|
87
|
-
懒加载的IAM客户端包装器
|
|
88
|
-
解决模块导入时的初始化顺序问题
|
|
89
|
-
"""
|
|
90
|
-
|
|
91
|
-
def __init__(self):
|
|
92
|
-
self._client = None
|
|
93
|
-
self._initialized = False
|
|
94
|
-
|
|
95
|
-
def _get_client(self) -> ConnectAgenterraIam:
|
|
96
|
-
"""获取实际的IAM客户端实例"""
|
|
97
|
-
if not self._initialized:
|
|
98
|
-
try:
|
|
99
|
-
manager = get_global_manager()
|
|
100
|
-
self._client = manager.get_client()
|
|
101
|
-
self._initialized = True
|
|
102
|
-
except Exception as e:
|
|
103
|
-
# 提供更详细的错误信息和解决建议
|
|
104
|
-
error_msg = (
|
|
105
|
-
f"获取IAM客户端失败: {str(e)}\n\n"
|
|
106
|
-
"解决方案:\n"
|
|
107
|
-
"1. 确保在使用IAM客户端前调用 init_skyplatform_iam() 初始化SDK\n"
|
|
108
|
-
"2. 避免在模块导入时直接调用 get_iam_client(),应在函数内部调用\n"
|
|
109
|
-
"3. 检查初始化顺序,确保SDK在应用启动时正确初始化\n\n"
|
|
110
|
-
"正确的使用方式:\n"
|
|
111
|
-
"```python\n"
|
|
112
|
-
"# 在main.py或应用启动时\n"
|
|
113
|
-
"from skyplatform_iam import init_skyplatform_iam\n"
|
|
114
|
-
"init_skyplatform_iam(app, config)\n\n"
|
|
115
|
-
"# 在业务代码中\n"
|
|
116
|
-
"def some_function():\n"
|
|
117
|
-
" iam_client = get_iam_client() # 在函数内部调用\n"
|
|
118
|
-
" return iam_client.login_with_password(...)\n"
|
|
119
|
-
"```"
|
|
120
|
-
)
|
|
121
|
-
logger.error(error_msg)
|
|
122
|
-
raise IAMServiceError(error_msg)
|
|
123
|
-
return self._client
|
|
124
|
-
|
|
125
|
-
def __getattr__(self, name):
|
|
126
|
-
"""代理所有属性访问到实际的IAM客户端"""
|
|
127
|
-
client = self._get_client()
|
|
128
|
-
return getattr(client, name)
|
|
129
|
-
|
|
130
|
-
def __repr__(self):
|
|
131
|
-
"""提供有用的调试信息"""
|
|
132
|
-
if self._initialized and self._client:
|
|
133
|
-
return f"<LazyIAMClient: {repr(self._client)}>"
|
|
134
|
-
else:
|
|
135
|
-
return "<LazyIAMClient: 未初始化,将在首次使用时自动初始化>"
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def get_iam_client() -> ConnectAgenterraIam:
|
|
139
|
-
"""
|
|
140
|
-
获取全局IAM客户端实例
|
|
141
|
-
|
|
142
|
-
Returns:
|
|
143
|
-
ConnectAgenterraIam: IAM客户端实例
|
|
144
|
-
|
|
145
|
-
Raises:
|
|
146
|
-
IAMServiceError: 如果SDK未初始化
|
|
147
|
-
|
|
148
|
-
Example:
|
|
149
|
-
# 正确的使用方式 - 注意要加括号调用函数
|
|
150
|
-
iam_client = get_iam_client() # 正确 ✓
|
|
151
|
-
user_info = iam_client.get_user_by_id("user123")
|
|
152
|
-
|
|
153
|
-
# 用于登录验证
|
|
154
|
-
result = iam_client.login_with_password(
|
|
155
|
-
username="test_user",
|
|
156
|
-
password="password123"
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
# 常见错误 - 不要这样做
|
|
160
|
-
# iam_client = get_iam_client # 错误 ✗ 缺少括号
|
|
161
|
-
# 这会导致 'function' object has no attribute 'login_with_password' 错误
|
|
162
|
-
|
|
163
|
-
Note:
|
|
164
|
-
确保在调用此函数前已经通过 init_skyplatform_iam() 初始化了SDK
|
|
165
|
-
|
|
166
|
-
Warning:
|
|
167
|
-
避免在模块导入时直接调用此函数,应在函数内部调用以避免初始化顺序问题
|
|
168
|
-
"""
|
|
169
|
-
try:
|
|
170
|
-
manager = get_global_manager()
|
|
171
|
-
return manager.get_client()
|
|
172
|
-
except Exception as e:
|
|
173
|
-
# 提供更详细的错误信息和解决建议
|
|
174
|
-
error_msg = (
|
|
175
|
-
f"获取IAM客户端失败: {str(e)}\n\n"
|
|
176
|
-
"解决方案:\n"
|
|
177
|
-
"1. 确保在使用IAM客户端前调用 init_skyplatform_iam() 初始化SDK\n"
|
|
178
|
-
"2. 避免在模块导入时直接调用 get_iam_client(),应在函数内部调用\n"
|
|
179
|
-
"3. 检查初始化顺序,确保SDK在应用启动时正确初始化\n\n"
|
|
180
|
-
"正确的使用方式:\n"
|
|
181
|
-
"```python\n"
|
|
182
|
-
"# 在main.py或应用启动时\n"
|
|
183
|
-
"from skyplatform_iam import init_skyplatform_iam\n"
|
|
184
|
-
"init_skyplatform_iam(app, config)\n\n"
|
|
185
|
-
"# 在业务代码中\n"
|
|
186
|
-
"def some_function():\n"
|
|
187
|
-
" iam_client = get_iam_client() # 在函数内部调用\n"
|
|
188
|
-
" return iam_client.login_with_password(...)\n"
|
|
189
|
-
"```\n\n"
|
|
190
|
-
"如果需要在模块级别使用IAM客户端,请考虑使用 create_lazy_iam_client() 函数"
|
|
191
|
-
)
|
|
192
|
-
logger.error(error_msg)
|
|
193
|
-
raise IAMServiceError(error_msg)
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
def create_lazy_iam_client() -> LazyIAMClient:
|
|
197
|
-
"""
|
|
198
|
-
创建懒加载的IAM客户端实例
|
|
199
|
-
|
|
200
|
-
这个函数专门用于解决模块导入时的初始化顺序问题。
|
|
201
|
-
返回的客户端会在首次使用时才进行实际的初始化。
|
|
202
|
-
|
|
203
|
-
Returns:
|
|
204
|
-
LazyIAMClient: 懒加载的IAM客户端包装器
|
|
205
|
-
|
|
206
|
-
Example:
|
|
207
|
-
# 在模块级别安全使用(推荐用于解决导入顺序问题)
|
|
208
|
-
iam_client = create_lazy_iam_client()
|
|
209
|
-
|
|
210
|
-
# 在函数中使用时才会真正初始化
|
|
211
|
-
def login_user(username, password):
|
|
212
|
-
return iam_client.login_with_password(username, password)
|
|
213
|
-
|
|
214
|
-
# 也可以在类中使用
|
|
215
|
-
class AuthService:
|
|
216
|
-
def __init__(self):
|
|
217
|
-
self.iam_client = create_lazy_iam_client()
|
|
218
|
-
|
|
219
|
-
def authenticate(self, username, password):
|
|
220
|
-
return self.iam_client.login_with_password(username, password)
|
|
221
|
-
"""
|
|
222
|
-
return LazyIAMClient()
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
async def get_current_user_info(request: Request) -> Optional[Dict[str, Any]]:
|
|
226
|
-
"""
|
|
227
|
-
便捷方法:获取当前用户信息
|
|
228
|
-
|
|
229
|
-
Args:
|
|
230
|
-
request: FastAPI请求对象
|
|
231
|
-
|
|
232
|
-
Returns:
|
|
233
|
-
Optional[Dict]: 用户信息字典,如果未登录则返回None
|
|
234
|
-
|
|
235
|
-
Raises:
|
|
236
|
-
IAMServiceError: 如果SDK未初始化
|
|
237
|
-
|
|
238
|
-
Example:
|
|
239
|
-
@app.get("/profile")
|
|
240
|
-
async def get_profile(request: Request):
|
|
241
|
-
user = await get_current_user_info(request)
|
|
242
|
-
if not user:
|
|
243
|
-
raise HTTPException(401, "未登录")
|
|
244
|
-
return {"user": user}
|
|
245
|
-
"""
|
|
246
|
-
try:
|
|
247
|
-
manager = get_global_manager()
|
|
248
|
-
return await manager.get_current_user_info(request)
|
|
249
|
-
except Exception as e:
|
|
250
|
-
logger.error(f"获取当前用户信息失败: {str(e)}")
|
|
251
|
-
if isinstance(e, IAMServiceError):
|
|
252
|
-
raise
|
|
253
|
-
return None
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
async def verify_permission(
|
|
257
|
-
user_id: str,
|
|
258
|
-
permission: str,
|
|
259
|
-
resource: Optional[str] = None
|
|
260
|
-
) -> bool:
|
|
261
|
-
"""
|
|
262
|
-
便捷方法:验证用户权限
|
|
263
|
-
|
|
264
|
-
Args:
|
|
265
|
-
user_id: 用户ID
|
|
266
|
-
permission: 权限标识
|
|
267
|
-
resource: 资源标识(可选)
|
|
268
|
-
|
|
269
|
-
Returns:
|
|
270
|
-
bool: 是否有权限
|
|
271
|
-
|
|
272
|
-
Raises:
|
|
273
|
-
IAMServiceError: 如果SDK未初始化
|
|
274
|
-
|
|
275
|
-
Example:
|
|
276
|
-
has_permission = await verify_permission("user123", "read", "document")
|
|
277
|
-
if not has_permission:
|
|
278
|
-
raise HTTPException(403, "权限不足")
|
|
279
|
-
"""
|
|
280
|
-
try:
|
|
281
|
-
manager = get_global_manager()
|
|
282
|
-
return await manager.verify_permission(user_id, permission, resource)
|
|
283
|
-
except Exception as e:
|
|
284
|
-
logger.error(f"权限验证失败: {str(e)}")
|
|
285
|
-
if isinstance(e, IAMServiceError):
|
|
286
|
-
raise
|
|
287
|
-
return False
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
def get_config() -> AuthConfig:
|
|
291
|
-
"""
|
|
292
|
-
获取当前配置
|
|
293
|
-
|
|
294
|
-
Returns:
|
|
295
|
-
AuthConfig: 当前认证配置
|
|
296
|
-
|
|
297
|
-
Raises:
|
|
298
|
-
IAMServiceError: 如果SDK未初始化
|
|
299
|
-
|
|
300
|
-
Example:
|
|
301
|
-
config = get_config()
|
|
302
|
-
print(f"当前服务名: {config.server_name}")
|
|
303
|
-
"""
|
|
304
|
-
try:
|
|
305
|
-
manager = get_global_manager()
|
|
306
|
-
return manager.get_config()
|
|
307
|
-
except Exception as e:
|
|
308
|
-
logger.error(f"获取配置失败: {str(e)}")
|
|
309
|
-
raise
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
def get_sdk_status() -> Dict[str, Any]:
|
|
313
|
-
"""
|
|
314
|
-
获取SDK状态信息
|
|
315
|
-
|
|
316
|
-
Returns:
|
|
317
|
-
Dict: SDK状态信息
|
|
318
|
-
|
|
319
|
-
Example:
|
|
320
|
-
status = get_sdk_status()
|
|
321
|
-
print(f"SDK初始化状态: {status['initialized']}")
|
|
322
|
-
"""
|
|
323
|
-
try:
|
|
324
|
-
manager = get_global_manager()
|
|
325
|
-
return manager.get_status()
|
|
326
|
-
except Exception as e:
|
|
327
|
-
logger.error(f"获取SDK状态失败: {str(e)}")
|
|
328
|
-
return {
|
|
329
|
-
"initialized": False,
|
|
330
|
-
"error": str(e)
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
def reset_sdk() -> None:
|
|
335
|
-
"""
|
|
336
|
-
重置SDK状态(主要用于测试)
|
|
337
|
-
|
|
338
|
-
Warning:
|
|
339
|
-
此方法会清除所有SDK状态,仅在测试环境中使用
|
|
340
|
-
"""
|
|
341
|
-
logger.warning("重置SDK状态")
|
|
342
|
-
try:
|
|
343
|
-
manager = get_global_manager()
|
|
344
|
-
manager.reset()
|
|
345
|
-
logger.info("SDK状态已重置")
|
|
346
|
-
except Exception as e:
|
|
347
|
-
logger.error(f"重置SDK状态失败: {str(e)}")
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
# 向后兼容的别名
|
|
351
|
-
def setup_auth(app: FastAPI, config: Optional[AuthConfig] = None) -> GlobalIAMManager:
|
|
352
|
-
"""
|
|
353
|
-
向后兼容的初始化函数
|
|
354
|
-
|
|
355
|
-
Args:
|
|
356
|
-
app: FastAPI应用实例
|
|
357
|
-
config: 认证配置
|
|
358
|
-
|
|
359
|
-
Returns:
|
|
360
|
-
GlobalIAMManager: 全局IAM管理器实例
|
|
361
|
-
|
|
362
|
-
Deprecated:
|
|
363
|
-
请使用 init_skyplatform_iam() 替代
|
|
364
|
-
"""
|
|
365
|
-
logger.warning("setup_auth()已废弃,请使用init_skyplatform_iam()替代")
|
|
366
|
-
return init_skyplatform_iam(app, config)
|
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
SkyPlatform IAM SDK 全局管理器模块
|
|
3
|
-
提供单例模式的全局状态管理,确保线程安全和统一配置
|
|
4
|
-
"""
|
|
5
|
-
import threading
|
|
6
|
-
import logging
|
|
7
|
-
from typing import Optional, Dict, Any, TYPE_CHECKING
|
|
8
|
-
from fastapi import FastAPI, Request
|
|
9
|
-
|
|
10
|
-
from .config import AuthConfig
|
|
11
|
-
from .connect_agenterra_iam import ConnectAgenterraIam
|
|
12
|
-
from .exceptions import ConfigurationError, IAMServiceError
|
|
13
|
-
|
|
14
|
-
# 使用TYPE_CHECKING避免循环导入
|
|
15
|
-
if TYPE_CHECKING:
|
|
16
|
-
from .middleware import AuthMiddleware
|
|
17
|
-
|
|
18
|
-
logger = logging.getLogger(__name__)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class GlobalIAMManager:
|
|
22
|
-
"""
|
|
23
|
-
全局IAM管理器,使用单例模式
|
|
24
|
-
负责管理全局的IAM配置、客户端实例和中间件
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
_instance: Optional['GlobalIAMManager'] = None
|
|
28
|
-
_lock = threading.Lock()
|
|
29
|
-
|
|
30
|
-
def __new__(cls) -> 'GlobalIAMManager':
|
|
31
|
-
"""单例模式实现,确保线程安全"""
|
|
32
|
-
if cls._instance is None:
|
|
33
|
-
with cls._lock:
|
|
34
|
-
if cls._instance is None:
|
|
35
|
-
cls._instance = super().__new__(cls)
|
|
36
|
-
cls._instance._initialized = False
|
|
37
|
-
return cls._instance
|
|
38
|
-
|
|
39
|
-
def __init__(self):
|
|
40
|
-
"""初始化全局管理器"""
|
|
41
|
-
if hasattr(self, '_initialized') and self._initialized:
|
|
42
|
-
return
|
|
43
|
-
|
|
44
|
-
self._config: Optional[AuthConfig] = None
|
|
45
|
-
self._iam_client: Optional[ConnectAgenterraIam] = None
|
|
46
|
-
self._middleware: Optional['AuthMiddleware'] = None
|
|
47
|
-
self._app: Optional[FastAPI] = None
|
|
48
|
-
self._initialized = False
|
|
49
|
-
self._init_lock = threading.Lock()
|
|
50
|
-
|
|
51
|
-
logger.debug("GlobalIAMManager实例已创建")
|
|
52
|
-
|
|
53
|
-
def initialize(self, app: FastAPI, config: Optional[AuthConfig] = None, **kwargs) -> None:
|
|
54
|
-
"""
|
|
55
|
-
初始化IAM管理器
|
|
56
|
-
|
|
57
|
-
Args:
|
|
58
|
-
app: FastAPI应用实例
|
|
59
|
-
config: 认证配置,如果为None则从环境变量加载
|
|
60
|
-
**kwargs: 额外配置参数
|
|
61
|
-
|
|
62
|
-
Raises:
|
|
63
|
-
ConfigurationError: 配置错误
|
|
64
|
-
IAMServiceError: IAM服务连接错误
|
|
65
|
-
"""
|
|
66
|
-
with self._init_lock:
|
|
67
|
-
if self._initialized:
|
|
68
|
-
logger.warning("GlobalIAMManager已经初始化,跳过重复初始化")
|
|
69
|
-
return
|
|
70
|
-
|
|
71
|
-
try:
|
|
72
|
-
# 1. 处理配置
|
|
73
|
-
if config is None:
|
|
74
|
-
logger.info("未提供配置,尝试从环境变量加载")
|
|
75
|
-
config = AuthConfig.from_env()
|
|
76
|
-
|
|
77
|
-
# 验证配置
|
|
78
|
-
config.validate_config()
|
|
79
|
-
self._config = config
|
|
80
|
-
|
|
81
|
-
# 2. 创建IAM客户端
|
|
82
|
-
self._iam_client = ConnectAgenterraIam(config=config)
|
|
83
|
-
logger.info(f"IAM客户端已创建,连接到: {config.agenterra_iam_host}")
|
|
84
|
-
|
|
85
|
-
# 3. 创建中间件(不直接注册,由用户决定)
|
|
86
|
-
from .middleware import AuthMiddleware
|
|
87
|
-
self._middleware = AuthMiddleware(app=app, config=config, use_global_manager=False)
|
|
88
|
-
logger.info("认证中间件已创建")
|
|
89
|
-
|
|
90
|
-
# 4. 保存应用引用
|
|
91
|
-
self._app = app
|
|
92
|
-
|
|
93
|
-
# 5. 标记为已初始化
|
|
94
|
-
self._initialized = True
|
|
95
|
-
|
|
96
|
-
logger.info(f"GlobalIAMManager初始化完成 - 服务: {config.server_name}, "
|
|
97
|
-
f"白名单路径数量: {len(config.get_whitelist_paths())}")
|
|
98
|
-
|
|
99
|
-
except Exception as e:
|
|
100
|
-
logger.error(f"GlobalIAMManager初始化失败: {str(e)}")
|
|
101
|
-
# 清理部分初始化的状态
|
|
102
|
-
self._config = None
|
|
103
|
-
self._iam_client = None
|
|
104
|
-
self._middleware = None
|
|
105
|
-
self._app = None
|
|
106
|
-
|
|
107
|
-
if isinstance(e, (ConfigurationError, IAMServiceError)):
|
|
108
|
-
raise
|
|
109
|
-
else:
|
|
110
|
-
raise IAMServiceError(f"初始化失败: {str(e)}")
|
|
111
|
-
|
|
112
|
-
def get_client(self) -> ConnectAgenterraIam:
|
|
113
|
-
"""
|
|
114
|
-
获取IAM客户端实例
|
|
115
|
-
|
|
116
|
-
Returns:
|
|
117
|
-
ConnectAgenterraIam: IAM客户端实例
|
|
118
|
-
|
|
119
|
-
Raises:
|
|
120
|
-
IAMServiceError: 如果管理器未初始化
|
|
121
|
-
"""
|
|
122
|
-
if not self._initialized or self._iam_client is None:
|
|
123
|
-
raise IAMServiceError(
|
|
124
|
-
"GlobalIAMManager未初始化,请先调用init_skyplatform_iam()函数进行初始化"
|
|
125
|
-
)
|
|
126
|
-
return self._iam_client
|
|
127
|
-
|
|
128
|
-
def get_config(self) -> AuthConfig:
|
|
129
|
-
"""
|
|
130
|
-
获取当前配置
|
|
131
|
-
|
|
132
|
-
Returns:
|
|
133
|
-
AuthConfig: 当前认证配置
|
|
134
|
-
|
|
135
|
-
Raises:
|
|
136
|
-
IAMServiceError: 如果管理器未初始化
|
|
137
|
-
"""
|
|
138
|
-
if not self._initialized or self._config is None:
|
|
139
|
-
raise IAMServiceError(
|
|
140
|
-
"GlobalIAMManager未初始化,请先调用init_skyplatform_iam()函数进行初始化"
|
|
141
|
-
)
|
|
142
|
-
return self._config
|
|
143
|
-
|
|
144
|
-
def get_middleware(self) -> 'AuthMiddleware':
|
|
145
|
-
"""
|
|
146
|
-
获取中间件实例
|
|
147
|
-
|
|
148
|
-
Returns:
|
|
149
|
-
AuthMiddleware: 认证中间件实例
|
|
150
|
-
|
|
151
|
-
Raises:
|
|
152
|
-
IAMServiceError: 如果管理器未初始化
|
|
153
|
-
"""
|
|
154
|
-
if not self._initialized or self._middleware is None:
|
|
155
|
-
raise IAMServiceError(
|
|
156
|
-
"GlobalIAMManager未初始化,请先调用init_skyplatform_iam()函数进行初始化"
|
|
157
|
-
)
|
|
158
|
-
return self._middleware
|
|
159
|
-
|
|
160
|
-
def is_initialized(self) -> bool:
|
|
161
|
-
"""
|
|
162
|
-
检查是否已初始化
|
|
163
|
-
|
|
164
|
-
Returns:
|
|
165
|
-
bool: 是否已初始化
|
|
166
|
-
"""
|
|
167
|
-
return self._initialized
|
|
168
|
-
|
|
169
|
-
async def get_current_user_info(self, request: Request) -> Optional[Dict[str, Any]]:
|
|
170
|
-
"""
|
|
171
|
-
便捷方法:获取当前用户信息
|
|
172
|
-
|
|
173
|
-
Args:
|
|
174
|
-
request: FastAPI请求对象
|
|
175
|
-
|
|
176
|
-
Returns:
|
|
177
|
-
Optional[Dict]: 用户信息字典,如果未登录则返回None
|
|
178
|
-
|
|
179
|
-
Raises:
|
|
180
|
-
IAMServiceError: 如果管理器未初始化
|
|
181
|
-
"""
|
|
182
|
-
if not self._initialized:
|
|
183
|
-
raise IAMServiceError(
|
|
184
|
-
"GlobalIAMManager未初始化,请先调用init_skyplatform_iam()函数进行初始化"
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
# 检查请求状态中是否已有用户信息(由中间件设置)
|
|
188
|
-
if hasattr(request.state, 'user') and request.state.user:
|
|
189
|
-
return request.state.user
|
|
190
|
-
|
|
191
|
-
# 如果中间件没有设置用户信息,尝试手动验证
|
|
192
|
-
try:
|
|
193
|
-
from .middleware import AuthService
|
|
194
|
-
auth_service = AuthService(self._config)
|
|
195
|
-
return await auth_service.get_current_user(request)
|
|
196
|
-
except Exception as e:
|
|
197
|
-
logger.error(f"获取用户信息失败: {str(e)}")
|
|
198
|
-
return None
|
|
199
|
-
|
|
200
|
-
async def verify_permission(
|
|
201
|
-
self,
|
|
202
|
-
user_id: str,
|
|
203
|
-
permission: str,
|
|
204
|
-
resource: Optional[str] = None
|
|
205
|
-
) -> bool:
|
|
206
|
-
"""
|
|
207
|
-
便捷方法:验证用户权限
|
|
208
|
-
|
|
209
|
-
Args:
|
|
210
|
-
user_id: 用户ID
|
|
211
|
-
permission: 权限标识
|
|
212
|
-
resource: 资源标识(可选)
|
|
213
|
-
|
|
214
|
-
Returns:
|
|
215
|
-
bool: 是否有权限
|
|
216
|
-
|
|
217
|
-
Raises:
|
|
218
|
-
IAMServiceError: 如果管理器未初始化
|
|
219
|
-
"""
|
|
220
|
-
client = self.get_client()
|
|
221
|
-
try:
|
|
222
|
-
# 这里可以根据实际的IAM客户端API进行权限验证
|
|
223
|
-
# 目前先返回True,具体实现需要根据ConnectAgenterraIam的API
|
|
224
|
-
logger.info(f"验证权限: user_id={user_id}, permission={permission}, resource={resource}")
|
|
225
|
-
return True
|
|
226
|
-
except Exception as e:
|
|
227
|
-
logger.error(f"权限验证失败: {str(e)}")
|
|
228
|
-
return False
|
|
229
|
-
|
|
230
|
-
def reset(self) -> None:
|
|
231
|
-
"""
|
|
232
|
-
重置管理器状态(主要用于测试)
|
|
233
|
-
"""
|
|
234
|
-
with self._init_lock:
|
|
235
|
-
self._config = None
|
|
236
|
-
self._iam_client = None
|
|
237
|
-
self._middleware = None
|
|
238
|
-
self._app = None
|
|
239
|
-
self._initialized = False
|
|
240
|
-
logger.info("GlobalIAMManager状态已重置")
|
|
241
|
-
|
|
242
|
-
def get_status(self) -> Dict[str, Any]:
|
|
243
|
-
"""
|
|
244
|
-
获取管理器状态信息
|
|
245
|
-
|
|
246
|
-
Returns:
|
|
247
|
-
Dict: 状态信息
|
|
248
|
-
"""
|
|
249
|
-
return {
|
|
250
|
-
"initialized": self._initialized,
|
|
251
|
-
"has_config": self._config is not None,
|
|
252
|
-
"has_client": self._iam_client is not None,
|
|
253
|
-
"has_middleware": self._middleware is not None,
|
|
254
|
-
"has_app": self._app is not None,
|
|
255
|
-
"server_name": self._config.server_name if self._config else None,
|
|
256
|
-
"iam_host": self._config.agenterra_iam_host if self._config else None,
|
|
257
|
-
"whitelist_paths_count": len(self._config.get_whitelist_paths()) if self._config else 0
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
# 全局管理器实例
|
|
262
|
-
_global_manager = GlobalIAMManager()
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
def get_global_manager() -> GlobalIAMManager:
|
|
266
|
-
"""
|
|
267
|
-
获取全局管理器实例
|
|
268
|
-
|
|
269
|
-
Returns:
|
|
270
|
-
GlobalIAMManager: 全局管理器实例
|
|
271
|
-
"""
|
|
272
|
-
return _global_manager
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
skyplatform_iam/__init__.py,sha256=eR2309T98s1UlxbxWBJEXTQkFV0ns-Dtfej5dYGkP-4,4000
|
|
2
|
-
skyplatform_iam/api.py,sha256=O-E8S5A1_IBQifEE2ZiuQFKyPgrCsKjFVdAifHzBpDs,11617
|
|
3
|
-
skyplatform_iam/config.py,sha256=ntIIuIsLWO4VD7-J4umRkXwiXUzZxJgBMykslsuqvQI,8990
|
|
4
|
-
skyplatform_iam/connect_agenterra_iam.py,sha256=m4JgfZuCPue-VaG4kEpR9oALoiX3uRTCQ4q3bZB7iyw,42097
|
|
5
|
-
skyplatform_iam/exceptions.py,sha256=Rt55QIzVK1F_kn6yzKQKKakD6PZDFdPLCGaCphKKms8,2166
|
|
6
|
-
skyplatform_iam/global_manager.py,sha256=EBlg9Z73UOJCWrG-o1AOQL5P96nWEMNEIdpm-femTds,9295
|
|
7
|
-
skyplatform_iam/middleware.py,sha256=nnr9CUEIB8gcLs5NsdDHVkB5AoB-pjzl4edlK1rXSuk,20059
|
|
8
|
-
skyplatform_iam-1.0.5.dist-info/METADATA,sha256=7xNHv_W28e9AMgV6W8ArRSw8f707TL8tdcGeZQHSnCM,12658
|
|
9
|
-
skyplatform_iam-1.0.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
10
|
-
skyplatform_iam-1.0.5.dist-info/RECORD,,
|
|
File without changes
|