Skip to content

Commit 381c844

Browse files
authored
Merge pull request #2724 from hongwei1/obp-develop
feature/addd provider to getResourceUserId method
2 parents e6c73b7 + c335c99 commit 381c844

9 files changed

Lines changed: 2882 additions & 152 deletions

File tree

obp-api/src/main/scala/code/api/directlogin.scala

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -575,9 +575,26 @@ object DirectLogin extends RestHelper with MdcLoggable {
575575
val username = directLoginParameters.getOrElse("username", "")
576576
val password = directLoginParameters.getOrElse("password", "")
577577

578-
//we first try to get the userId from local, if not find, we try to get it from external
579-
AuthUser.getResourceUserId(username, password)
580-
.or(AuthUser.externalUserHelper(username, password).map(_.user.get))
578+
logger.debug(s"getUserId: attempting authentication for username: $username")
579+
580+
// Try local provider first
581+
val localResult = AuthUser.getResourceUserId(username, password, Constant.localIdentityProvider)
582+
localResult match {
583+
case Full(userId) =>
584+
logger.debug(s"getUserId: local authentication succeeded for username: $username, userId: $userId")
585+
localResult
586+
case _ =>
587+
logger.debug(s"getUserId: local authentication failed for username: $username, trying external provider")
588+
// Try external provider as fallback
589+
val externalResult = AuthUser.getResourceUserId(username, password, s"External")
590+
externalResult match {
591+
case Full(userId) =>
592+
logger.debug(s"getUserId: external authentication succeeded for username: $username, userId: $userId")
593+
case _ =>
594+
logger.debug(s"getUserId: external authentication also failed for username: $username")
595+
}
596+
externalResult
597+
}
581598
}
582599

583600

obp-api/src/main/scala/code/api/util/Glossary.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5237,7 +5237,7 @@ object Glossary extends MdcLoggable {
52375237
|
52385238
|1. **Check only** — validates credentials and returns user info, but does not create a session or token
52395239
|2. **Requires an already-authenticated caller** with `canVerifyUserCredentials` role (or SuperAdmin)
5240-
|3. **May auto-provision users** — if the local lookup fails and the external fallback via `externalUserHelper()` / `checkExternalUserViaConnector()` succeeds, a new AuthUser and ResourceUser will be created locally (same behaviour as the web login flow)
5240+
|3. **May auto-provision users** — if the local lookup fails and the external fallback via `checkExternalUserViaConnector()` succeeds, a new AuthUser and ResourceUser will be created locally (same behaviour as the web login flow)
52415241
|4. **Provider matching** — optionally verifies the user's provider matches what was posted (skipped if provider is empty)
52425242
|
52435243
|### Key Source Files

obp-api/src/main/scala/code/api/v6_0_0/APIMethods600.scala

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8772,39 +8772,17 @@ trait APIMethods600 {
87728772
decodedProvider = URLDecoder.decode(postedData.provider, StandardCharsets.UTF_8)
87738773
// Validate credentials using the existing AuthUser mechanism
87748774

8775-
resourceUserIdBox =
8776-
if (decodedProvider == Constant.localIdentityProvider || decodedProvider.isEmpty) {
8777-
// Local provider: only check local credentials. No external fallback.
8778-
val result = code.model.dataAccess.AuthUser.getResourceUserId(
8779-
postedData.username, postedData.password, Constant.localIdentityProvider
8780-
)
8781-
logger.info(s"verifyUserCredentials says: local getResourceUserId result: $result")
8782-
result
8783-
} else {
8784-
// External provider: validate via connector. Local DB stores a random UUID
8785-
// as password for external users, so getResourceUserId would always fail.
8786-
if (LoginAttempt.userIsLocked(decodedProvider, postedData.username)) {
8787-
logger.info(s"verifyUserCredentials says: external user is locked, provider: ${decodedProvider}, username: ${postedData.username}")
8788-
Full(code.model.dataAccess.AuthUser.usernameLockedStateCode)
8789-
} else {
8790-
val connectorResult = code.model.dataAccess.AuthUser.externalUserHelper(
8791-
postedData.username, postedData.password
8792-
).map(_.user.get)
8793-
logger.info(s"verifyUserCredentials says: externalUserHelper result: $connectorResult")
8794-
connectorResult match {
8795-
case Full(_) =>
8796-
LoginAttempt.resetBadLoginAttempts(decodedProvider, postedData.username)
8797-
connectorResult
8798-
case _ =>
8799-
LoginAttempt.incrementBadLoginAttempts(decodedProvider, postedData.username)
8800-
connectorResult
8801-
}
8802-
}
8803-
}
8775+
resourceUserIdBox = code.model.dataAccess.AuthUser.getResourceUserId(
8776+
postedData.username, postedData.password, decodedProvider
8777+
)
88048778
// Check if account is locked
88058779
_ <- Helper.booleanToFuture(UsernameHasBeenLocked, 401, callContext) {
88068780
resourceUserIdBox != Full(code.model.dataAccess.AuthUser.usernameLockedStateCode)
88078781
}
8782+
// Check if email is validated
8783+
_ <- Helper.booleanToFuture(UserEmailNotValidated, 401, callContext) {
8784+
resourceUserIdBox != Full(code.model.dataAccess.AuthUser.userEmailNotValidatedStateCode)
8785+
}
88088786
// Check if credentials are valid
88098787
resourceUserId <- Future {
88108788
resourceUserIdBox

0 commit comments

Comments
 (0)