|
1 | 1 | use crate::common::string_utils::StringUtils; |
2 | 2 | use crate::ldap::model::LdapConfig; |
| 3 | +use crate::oauth2::model::OAuth2Config; |
3 | 4 | use crate::user::permission; |
4 | 5 | use crate::user::permission::UserRoleHelper; |
5 | 6 | use std::collections::HashSet; |
@@ -103,6 +104,19 @@ pub struct AppSysConfig { |
103 | 104 | pub ldap_user_admin_groups: Arc<HashSet<String>>, |
104 | 105 | pub ldap_user_default_role: Arc<String>, |
105 | 106 | pub mcp_http_timeout: u64, |
| 107 | + pub oauth2_enable: bool, |
| 108 | + pub oauth2_server_url: Arc<String>, |
| 109 | + pub oauth2_client_id: Arc<String>, |
| 110 | + pub oauth2_client_secret: Arc<String>, |
| 111 | + pub oauth2_authorization_url: Arc<String>, |
| 112 | + pub oauth2_token_url: Arc<String>, |
| 113 | + pub oauth2_userinfo_url: Arc<String>, |
| 114 | + pub oauth2_redirect_uri: Arc<String>, |
| 115 | + pub oauth2_scopes: Arc<String>, |
| 116 | + pub oauth2_username_claim_name: Arc<String>, |
| 117 | + pub oauth2_nickname_claim_name: Arc<String>, |
| 118 | + pub oauth2_user_default_role: Arc<String>, |
| 119 | + pub oauth2_button: Arc<String>, |
106 | 120 | } |
107 | 121 |
|
108 | 122 | impl AppSysConfig { |
@@ -265,6 +279,62 @@ impl AppSysConfig { |
265 | 279 | .unwrap_or("30".to_owned()) |
266 | 280 | .parse() |
267 | 281 | .unwrap_or(30); |
| 282 | + let oauth2_enable = std::env::var("RNACOS_OAUTH2_ENABLE") |
| 283 | + .unwrap_or("false".to_owned()) |
| 284 | + .parse() |
| 285 | + .unwrap_or(false); |
| 286 | + let oauth2_server_url = std::env::var("RNACOS_OAUTH2_SERVER_URL") |
| 287 | + .map(Arc::new) |
| 288 | + .unwrap_or(constant::EMPTY_ARC_STRING.clone()); |
| 289 | + let oauth2_client_id = std::env::var("RNACOS_OAUTH2_CLIENT_ID") |
| 290 | + .map(Arc::new) |
| 291 | + .unwrap_or(constant::EMPTY_ARC_STRING.clone()); |
| 292 | + let oauth2_client_secret = std::env::var("RNACOS_OAUTH2_CLIENT_SECRET") |
| 293 | + .map(Arc::new) |
| 294 | + .unwrap_or(constant::EMPTY_ARC_STRING.clone()); |
| 295 | + // OAuth2 endpoints should be full URLs |
| 296 | + let oauth2_authorization_url = std::env::var("RNACOS_OAUTH2_AUTHORIZATION_URL") |
| 297 | + .map(Arc::new) |
| 298 | + .unwrap_or_else(|_| { |
| 299 | + let server_url = std::env::var("RNACOS_OAUTH2_SERVER_URL") |
| 300 | + .unwrap_or_default(); |
| 301 | + Arc::new(format!("{}/oauth/authorize", server_url)) |
| 302 | + }); |
| 303 | + let oauth2_token_url = std::env::var("RNACOS_OAUTH2_TOKEN_URL") |
| 304 | + .map(Arc::new) |
| 305 | + .unwrap_or_else(|_| { |
| 306 | + let server_url = std::env::var("RNACOS_OAUTH2_SERVER_URL") |
| 307 | + .unwrap_or_default(); |
| 308 | + Arc::new(format!("{}/oauth/token", server_url)) |
| 309 | + }); |
| 310 | + let oauth2_userinfo_url = std::env::var("RNACOS_OAUTH2_USERINFO_URL") |
| 311 | + .map(Arc::new) |
| 312 | + .unwrap_or_else(|_| { |
| 313 | + let server_url = std::env::var("RNACOS_OAUTH2_SERVER_URL") |
| 314 | + .unwrap_or_default(); |
| 315 | + Arc::new(format!("{}/oauth/userinfo", server_url)) |
| 316 | + }); |
| 317 | + let oauth2_redirect_uri = std::env::var("RNACOS_OAUTH2_REDIRECT_URI") |
| 318 | + .map(Arc::new) |
| 319 | + .unwrap_or(constant::EMPTY_ARC_STRING.clone()); |
| 320 | + let oauth2_scopes = std::env::var("RNACOS_OAUTH2_SCOPES") |
| 321 | + .map(Arc::new) |
| 322 | + .unwrap_or_else(|_| Arc::new("openid profile".to_string())); |
| 323 | + let oauth2_username_claim_name = std::env::var("RNACOS_OAUTH2_USERNAME_CLAIM_NAME") |
| 324 | + .map(Arc::new) |
| 325 | + .unwrap_or_else(|_| Arc::new("username".to_string())); |
| 326 | + let oauth2_nickname_claim_name = std::env::var("RNACOS_OAUTH2_NICKNAME_CLAIM_NAME") |
| 327 | + .map(Arc::new) |
| 328 | + .unwrap_or_else(|_| Arc::new("name".to_string())); |
| 329 | + let oauth2_user_default_role = std::env::var("RNACOS_OAUTH2_USER_DEFAULT_ROLE") |
| 330 | + .map(|v| { |
| 331 | + let upper = v.to_uppercase(); |
| 332 | + UserRoleHelper::get_role_by_name(&upper, permission::USER_ROLE_DEVELOPER.clone()) |
| 333 | + }) |
| 334 | + .unwrap_or(permission::USER_ROLE_DEVELOPER.clone()); |
| 335 | + let oauth2_button = std::env::var("RNACOS_OAUTH2_BUTTON") |
| 336 | + .map(Arc::new) |
| 337 | + .unwrap_or_else(|_| Arc::new("OAuth2.0 登录".to_string())); |
268 | 338 | Self { |
269 | 339 | local_db_dir, |
270 | 340 | config_db_file, |
@@ -305,6 +375,19 @@ impl AppSysConfig { |
305 | 375 | ldap_user_admin_groups, |
306 | 376 | ldap_user_default_role, |
307 | 377 | mcp_http_timeout, |
| 378 | + oauth2_enable, |
| 379 | + oauth2_server_url, |
| 380 | + oauth2_client_id, |
| 381 | + oauth2_client_secret, |
| 382 | + oauth2_authorization_url, |
| 383 | + oauth2_token_url, |
| 384 | + oauth2_userinfo_url, |
| 385 | + oauth2_redirect_uri, |
| 386 | + oauth2_scopes, |
| 387 | + oauth2_username_claim_name, |
| 388 | + oauth2_nickname_claim_name, |
| 389 | + oauth2_user_default_role, |
| 390 | + oauth2_button, |
308 | 391 | } |
309 | 392 | } |
310 | 393 |
|
@@ -352,6 +435,22 @@ impl AppSysConfig { |
352 | 435 | ldap_user_default_role: self.ldap_user_default_role.clone(), |
353 | 436 | }) |
354 | 437 | } |
| 438 | + |
| 439 | + pub fn get_oauth2_config(&self) -> Arc<OAuth2Config> { |
| 440 | + Arc::new(OAuth2Config { |
| 441 | + oauth2_server_url: self.oauth2_server_url.clone(), |
| 442 | + oauth2_client_id: self.oauth2_client_id.clone(), |
| 443 | + oauth2_client_secret: self.oauth2_client_secret.clone(), |
| 444 | + oauth2_authorization_url: self.oauth2_authorization_url.clone(), |
| 445 | + oauth2_token_url: self.oauth2_token_url.clone(), |
| 446 | + oauth2_userinfo_url: self.oauth2_userinfo_url.clone(), |
| 447 | + oauth2_redirect_uri: self.oauth2_redirect_uri.clone(), |
| 448 | + oauth2_scopes: self.oauth2_scopes.clone(), |
| 449 | + oauth2_username_claim_name: self.oauth2_username_claim_name.clone(), |
| 450 | + oauth2_nickname_claim_name: self.oauth2_nickname_claim_name.clone(), |
| 451 | + oauth2_user_default_role: self.oauth2_user_default_role.clone(), |
| 452 | + }) |
| 453 | + } |
355 | 454 | } |
356 | 455 |
|
357 | 456 | /** |
|
0 commit comments