Skip to content

Commit 70ba7df

Browse files
committed
fix: preserve existing OAuth user roles instead of resetting to default
- Modified reply_login function to check for existing users before role assignment - Existing OAuth users now retain their current roles when OIDC provider doesn't return valid groups - Only new users get assigned default roles when no valid groups are provided - Fixes issue where existing OAuth users had their roles reset on every login
1 parent 51d8fcd commit 70ba7df

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

src/handlers/http/oidc.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -176,18 +176,27 @@ pub async fn reply_login(
176176
}
177177
}
178178
}
179+
180+
// Check if user already exists to preserve their existing roles
181+
let existing_user = Users.get_user(&username);
179182
if !role_exists || group.is_empty() {
180-
group = DEFAULT_ROLE
181-
.lock()
182-
.unwrap()
183-
.clone()
184-
.map(|role| HashSet::from([role]))
185-
.unwrap_or_default();
183+
group = if let Some(existing_user) = &existing_user {
184+
// Preserve existing user roles instead of assigning default
185+
existing_user.roles.clone()
186+
} else {
187+
// Only assign default role for new users
188+
DEFAULT_ROLE
189+
.lock()
190+
.unwrap()
191+
.clone()
192+
.map(|role| HashSet::from([role]))
193+
.unwrap_or_default()
194+
};
186195
}
187196

188197
// User may not exist
189198
// create a new one depending on state of metadata
190-
let user = match (Users.get_user(&username), group) {
199+
let user = match (existing_user, group) {
191200
(Some(user), group) => update_user_if_changed(user, group, user_info).await?,
192201
(None, group) => put_user(&username, group, user_info).await?,
193202
};

0 commit comments

Comments
 (0)