fix(auth): support employee ID usernames
giteabot backport / giteabot (push) Canceled after 0s
giteabot / giteabot (push) Canceled after 0s
release-nightly / nightly-binary (push) Canceled after 0s
release-nightly / nightly-container (push) Canceled after 0s
release-nightly-snapcraft / build-and-publish (push) Canceled after 0s

Assisted-by: Codex:GPT-5
This commit is contained in:
2026-08-29 18:42:44 +08:00
parent 746b23b098
commit ab55a432ec
6 changed files with 33 additions and 2 deletions
+5
View File
@@ -450,6 +450,11 @@ func extractUserNameFromOAuth2(gothUser *goth.User) (string, error) {
return user_model.NormalizeUserName(preferredUsername)
}
return "", nil
case setting.OAuth2UsernameEmployeeID:
if employeeID, ok := gothUser.RawData["employee_id"].(string); ok {
return user_model.NormalizeUserName(employeeID)
}
return "", nil
case setting.OAuth2UsernameNickname:
return user_model.NormalizeUserName(gothUser.NickName)
default: // OAuth2UsernameUserid
+14
View File
@@ -184,6 +184,20 @@ func TestWebAuthOAuth2(t *testing.T) {
})
}
func TestExtractUserNameFromOAuth2EmployeeID(t *testing.T) {
defer test.MockVariableValue(&setting.OAuth2Client.Username, setting.OAuth2UsernameEmployeeID)()
username, err := extractUserNameFromOAuth2(&goth.User{
RawData: map[string]any{"employee_id": "RC001"},
})
require.NoError(t, err)
assert.Equal(t, "RC001", username)
username, err = extractUserNameFromOAuth2(&goth.User{RawData: map[string]any{}})
require.NoError(t, err)
assert.Empty(t, username)
}
func TestOpenIDRequireTwoFactor(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
mockOpt := contexttest.MockContextOption{SessionStore: session.NewMockMemStore("dummy-sid-openid")}
+2
View File
@@ -160,6 +160,8 @@ func SignInOAuthCallback(ctx *context.Context) {
missingFields = append(missingFields, "nickname")
case setting.OAuth2UsernamePreferredUsername:
missingFields = append(missingFields, "preferred_username")
case setting.OAuth2UsernameEmployeeID:
missingFields = append(missingFields, "employee_id")
} // else: "UserID" and "Email" have been handled above separately
}
if len(missingFields) > 0 {