Skip to content

Commit fcd75b9

Browse files
Merge pull request #2238 from SujanSanjula96/roles-claim-1
2 parents ed5d95e + 422d34a commit fcd75b9

File tree

2 files changed

+58
-14
lines changed

2 files changed

+58
-14
lines changed

components/org.wso2.carbon.identity.oauth/src/main/java/org/wso2/carbon/identity/openidconnect/DefaultOIDCClaimsCallbackHandler.java

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.commons.logging.Log;
2626
import org.apache.commons.logging.LogFactory;
2727
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
28+
import org.wso2.carbon.CarbonConstants;
2829
import org.wso2.carbon.base.MultitenantConstants;
2930
import org.wso2.carbon.identity.application.authentication.framework.exception.FrameworkException;
3031
import org.wso2.carbon.identity.application.authentication.framework.handler.approles.ApplicationRolesResolver;
@@ -566,15 +567,30 @@ private Map<String, Object> getUserClaimsInOIDCDialect(String spTenantDomain,
566567
// Improve runtime claim value storage in cache through https://github.com/wso2/product-is/issues/15056
567568
requestedClaimUris.removeIf(claim -> claim.startsWith("http://wso2.org/claims/runtime/"));
568569

569-
boolean requestedAppRoleClaim = false;
570+
boolean roleClaimRequested = false;
571+
String rolesClaimURI = IdentityUtil.getLocalGroupsClaimURI();
572+
if (requestedClaimUris.contains(rolesClaimURI) && !CarbonConstants.ENABLE_LEGACY_AUTHZ_RUNTIME) {
573+
requestedClaimUris.remove(rolesClaimURI);
574+
roleClaimRequested = true;
575+
}
576+
boolean appRoleClaimRequested = false;
570577
if (requestedClaimUris.contains(APP_ROLES_CLAIM)) {
571578
requestedClaimUris.remove(APP_ROLES_CLAIM);
572-
requestedAppRoleClaim = true;
579+
appRoleClaimRequested = true;
573580
}
574581
Map<String, String> userClaims = getUserClaimsInLocalDialect(fullQualifiedUsername, realm, requestedClaimUris);
575-
if (requestedAppRoleClaim) {
576-
handleAppRoleClaimInLocalDialect(userClaims, authenticatedUser, serviceProvider.getApplicationResourceId());
582+
583+
if (roleClaimRequested || appRoleClaimRequested) {
584+
String[] appAssocatedRolesOfUser = getAppAssociatedRolesOfUser(authenticatedUser,
585+
serviceProvider.getApplicationResourceId());
586+
if (roleClaimRequested) {
587+
setRoleClaimInLocalDialect(userClaims, appAssocatedRolesOfUser);
588+
}
589+
if (appRoleClaimRequested) {
590+
setAppRoleClaimInLocalDialect(userClaims, appAssocatedRolesOfUser);
591+
}
577592
}
593+
578594
if (isEmpty(userClaims)) {
579595
// User claims can be empty if user does not exist in user stores. Probably a federated user.
580596
if (log.isDebugEnabled()) {
@@ -651,25 +667,51 @@ private String resolveUserIdForOrganizationSsoUser(AuthenticatedUser authenticat
651667
}
652668

653669
/**
654-
* Adds the application roles claim for local user.
670+
* Get app associated roles of the user.
655671
*
656-
* @param userClaims User claims in local dialect.
657672
* @param authenticatedUser Authenticated user.
658-
* @param applicationId Application ID.
659-
* @throws ApplicationRolesException Error while getting application roles.
673+
* @param applicationId Application id.
674+
* @return App associated roles of the user.
675+
* @throws ApplicationRolesException If an error occurred while getting app associated roles.
660676
*/
661-
private void handleAppRoleClaimInLocalDialect(Map<String, String> userClaims, AuthenticatedUser authenticatedUser,
662-
String applicationId) throws ApplicationRolesException {
677+
private String[] getAppAssociatedRolesOfUser(AuthenticatedUser authenticatedUser, String applicationId) throws
678+
ApplicationRolesException {
663679

664680
ApplicationRolesResolver appRolesResolver =
665681
OpenIDConnectServiceComponentHolder.getInstance().getHighestPriorityApplicationRolesResolver();
666682
if (appRolesResolver == null) {
667683
log.debug("No application roles resolver found. So not adding application roles claim to the id_token.");
668-
return;
684+
return new String[0];
685+
}
686+
return appRolesResolver.getRoles(authenticatedUser, applicationId);
687+
}
688+
689+
/**
690+
* Set the roles claim for local user.
691+
*
692+
* @param userClaims User claims in local dialect.
693+
* @param appAssociatedRoles App associated roles of the user.
694+
*/
695+
private void setRoleClaimInLocalDialect(Map<String, String> userClaims, String[] appAssociatedRoles) {
696+
697+
String rolesClaimURI = IdentityUtil.getLocalGroupsClaimURI();
698+
if (ArrayUtils.isNotEmpty(appAssociatedRoles)) {
699+
userClaims.put(rolesClaimURI,
700+
String.join(FrameworkUtils.getMultiAttributeSeparator(), appAssociatedRoles));
669701
}
670-
String[] appRoles = appRolesResolver.getRoles(authenticatedUser, applicationId);
671-
if (ArrayUtils.isNotEmpty(appRoles)) {
672-
userClaims.put(APP_ROLES_CLAIM, String.join(FrameworkUtils.getMultiAttributeSeparator(), appRoles));
702+
}
703+
704+
/**
705+
* Set the application roles claim for local user.
706+
*
707+
* @param userClaims User claims in local dialect.
708+
* @param appAssociatedRoles App associated roles of the user.
709+
*/
710+
private void setAppRoleClaimInLocalDialect(Map<String, String> userClaims, String[] appAssociatedRoles) {
711+
712+
if (ArrayUtils.isNotEmpty(appAssociatedRoles)) {
713+
userClaims.put(APP_ROLES_CLAIM,
714+
String.join(FrameworkUtils.getMultiAttributeSeparator(), appAssociatedRoles));
673715
}
674716
}
675717

components/org.wso2.carbon.identity.oauth/src/test/java/org/wso2/carbon/identity/openidconnect/DefaultOIDCClaimsCallbackHandlerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.testng.annotations.ObjectFactory;
4141
import org.testng.annotations.Test;
4242
import org.w3c.dom.Element;
43+
import org.wso2.carbon.CarbonConstants;
4344
import org.wso2.carbon.base.CarbonBaseConstants;
4445
import org.wso2.carbon.base.MultitenantConstants;
4546
import org.wso2.carbon.context.PrivilegedCarbonContext;
@@ -230,6 +231,7 @@ public class DefaultOIDCClaimsCallbackHandlerTest extends PowerMockTestCase {
230231
@BeforeClass
231232
public void setUp() throws Exception {
232233

234+
CarbonConstants.ENABLE_LEGACY_AUTHZ_RUNTIME = false;
233235
System.setProperty(CarbonBaseConstants.CARBON_HOME, CARBON_HOME);
234236
BasicDataSource dataSource1 = new BasicDataSource();
235237
dataSource1.setDriverClassName("org.h2.Driver");

0 commit comments

Comments
 (0)