Skip to content

Commit eda179e

Browse files
Improve scope validator for organization switching
1 parent 1b52b52 commit eda179e

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

components/org.wso2.carbon.identity.oauth/src/main/java/org/wso2/carbon/identity/oauth2/util/AuthzUtil.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
import org.wso2.carbon.identity.application.common.IdentityApplicationManagementException;
3030
import org.wso2.carbon.identity.application.common.model.ClaimMapping;
3131
import org.wso2.carbon.identity.oauth.internal.OAuthComponentServiceHolder;
32+
import org.wso2.carbon.identity.oauth2.IdentityOAuth2ClientException;
3233
import org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception;
3334
import org.wso2.carbon.identity.oauth2.internal.OAuth2ServiceComponentHolder;
35+
import org.wso2.carbon.identity.organization.management.organization.user.sharing.util.OrganizationSharedUserUtil;
3436
import org.wso2.carbon.identity.organization.management.service.exception.OrganizationManagementException;
3537
import org.wso2.carbon.identity.role.v2.mgt.core.exception.IdentityRoleManagementException;
3638
import org.wso2.carbon.user.api.UserStoreException;
@@ -46,6 +48,7 @@
4648
import java.util.HashSet;
4749
import java.util.List;
4850
import java.util.Map;
51+
import java.util.Optional;
4952

5053
import static org.wso2.carbon.identity.role.v2.mgt.core.RoleConstants.APPLICATION;
5154
import static org.wso2.carbon.identity.role.v2.mgt.core.RoleConstants.ORGANIZATION;
@@ -184,8 +187,15 @@ private static String getAccessingTenantDomain(AuthenticatedUser authenticatedUs
184187
*/
185188
private static String getAccessingUserId(AuthenticatedUser authenticatedUser) throws IdentityOAuth2Exception {
186189

187-
// TODO: resolve accessing user id.
188-
return getUserId(authenticatedUser);
190+
String associatedUserId = getUserId(authenticatedUser);
191+
try {
192+
Optional<String> optionalOrganizationUserId = OrganizationSharedUserUtil
193+
.getUserIdOfAssociatedUserByOrgId(associatedUserId, authenticatedUser.getAccessingOrganization());
194+
return optionalOrganizationUserId.orElseThrow(() ->
195+
new IdentityOAuth2ClientException("User is not allowed to access the organization"));
196+
} catch (OrganizationManagementException e) {
197+
throw new IdentityOAuth2Exception("Error while resolving shared user ID" , e);
198+
}
189199
}
190200

191201
/**

components/org.wso2.carbon.identity.oauth/src/main/java/org/wso2/carbon/identity/oauth2/validators/validationhandler/impl/RoleBasedScopeValidationHandler.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
package org.wso2.carbon.identity.oauth2.validators.validationhandler.impl;
2020

21+
import org.apache.commons.lang.StringUtils;
2122
import org.apache.commons.logging.Log;
2223
import org.apache.commons.logging.LogFactory;
2324
import org.wso2.carbon.identity.application.common.IdentityApplicationManagementException;
@@ -30,6 +31,7 @@
3031
import org.wso2.carbon.identity.oauth2.validators.validationhandler.ScopeValidationContext;
3132
import org.wso2.carbon.identity.oauth2.validators.validationhandler.ScopeValidationHandler;
3233
import org.wso2.carbon.identity.oauth2.validators.validationhandler.ScopeValidationHandlerException;
34+
import org.wso2.carbon.identity.organization.management.service.exception.OrganizationManagementException;
3335

3436
import java.util.ArrayList;
3537
import java.util.List;
@@ -60,13 +62,27 @@ public List<String> validateScopes(List<String> requestedScopes, List<String> ap
6062
if (userRoles.isEmpty()) {
6163
return new ArrayList<>();
6264
}
63-
List<String> filteredRoleIds = getFilteredRoleIds(userRoles, scopeValidationContext.getAppId(),
64-
scopeValidationContext.getAuthenticatedUser().getTenantDomain());
65+
String tenantDomain = scopeValidationContext.getAuthenticatedUser().getTenantDomain();
66+
String accessingOrganization = scopeValidationContext.getAuthenticatedUser().getAccessingOrganization();
67+
String userResidentOrganization = scopeValidationContext.getAuthenticatedUser()
68+
.getUserResidentOrganization();
69+
if (StringUtils.isNotEmpty(accessingOrganization)) {
70+
tenantDomain = resolveTenantDomainByOrgId(accessingOrganization);
71+
}
72+
73+
List<String> filteredRoleIds;
74+
if (accessingOrganization != null && !accessingOrganization.equals(userResidentOrganization)) {
75+
filteredRoleIds = userRoles;
76+
} else {
77+
filteredRoleIds =
78+
getFilteredRoleIds(userRoles, scopeValidationContext.getAppId(), tenantDomain);
79+
}
80+
6581
if (filteredRoleIds.isEmpty()) {
6682
return new ArrayList<>();
6783
}
6884
List<String> associatedScopes = AuthzUtil.getAssociatedScopesForRoles(filteredRoleIds,
69-
scopeValidationContext.getAuthenticatedUser().getTenantDomain());
85+
tenantDomain);
7086
List<String> filteredScopes = appAuthorizedScopes.stream().filter(associatedScopes::contains)
7187
.collect(Collectors.toList());
7288
return requestedScopes.stream().filter(filteredScopes::contains).collect(Collectors.toList());
@@ -124,4 +140,15 @@ public String getName() {
124140

125141
return "RoleBasedScopeValidationHandler";
126142
}
143+
144+
private String resolveTenantDomainByOrgId(String organizationId) throws ScopeValidationHandlerException {
145+
146+
try {
147+
return OAuth2ServiceComponentHolder.getInstance().getOrganizationManager()
148+
.resolveTenantDomain(organizationId);
149+
} catch (OrganizationManagementException e) {
150+
throw new ScopeValidationHandlerException("Error while resolving the tenant domain of the org ID: " +
151+
organizationId, e);
152+
}
153+
}
127154
}

0 commit comments

Comments
 (0)