Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(grant): enhance user on ExtensionGrant to get dynamic scopes #935

Draft
wants to merge 2 commits into
base: 2.10.x
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,11 @@ public interface UserService {
default Single<List<User>> findByDomainAndEmail(String domain, String email) {
return findByDomainAndEmail(domain, email, true);
}

/**
* Fetch roles information and add roles and permissions to user data
* @param user end user
* @return Enhanced user
*/
Single<User> enhanceRolesPermissions(User user);
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@
import io.gravitee.am.service.RoleService;
import io.reactivex.Maybe;
import io.reactivex.Single;
import io.reactivex.SingleSource;

import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
Expand Down Expand Up @@ -97,14 +100,29 @@ public Single<User> enhance(User user) {
}
// fetch roles information and enhance user data
if (!roles.isEmpty()) {
return roleService.findByIdIn(new ArrayList<>(roles))
.map(roles1 -> {
user.setRolesPermissions(roles1);
return user;
});
return enhanceRolesPermissions(user, roles);

}
return Single.just(user);
});
}

@Override
public Single<User> enhanceRolesPermissions(User user) {
return enhanceRolesPermissions(user, user.getRoles());
}

/**
* Fetch roles and set them to the user as roles-permissions.
* @param user user to enhance
* @param roleIds identifiers of the roles
* @return user enhanced with roles and permissions
*/
private Single<User> enhanceRolesPermissions(User user, Collection<String> roleIds) {
return roleService.findByIdIn(new ArrayList<>(roleIds))
.map(roles1 -> {
user.setRolesPermissions(roles1);
return user;
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import io.gravitee.am.extensiongrant.api.ExtensionGrantProvider;
import io.gravitee.am.gateway.handler.common.auth.UserAuthenticationManager;
import io.gravitee.am.gateway.handler.common.auth.idp.IdentityProviderManager;
import io.gravitee.am.gateway.handler.common.user.UserService;
import io.gravitee.am.gateway.handler.oauth2.exception.InvalidGrantException;
import io.gravitee.am.gateway.handler.oauth2.exception.UnauthorizedClientException;
import io.gravitee.am.gateway.handler.oauth2.service.granter.AbstractTokenGranter;
Expand Down Expand Up @@ -55,14 +56,16 @@ public class ExtensionGrantGranter extends AbstractTokenGranter {
private final ExtensionGrant extensionGrant;
private final UserAuthenticationManager userAuthenticationManager;
private final IdentityProviderManager identityProviderManager;
private final UserService userService;
private Date minDate;

public ExtensionGrantGranter(ExtensionGrantProvider extensionGrantProvider,
ExtensionGrant extensionGrant,
UserAuthenticationManager userAuthenticationManager,
TokenService tokenService,
TokenRequestResolver tokenRequestResolver,
IdentityProviderManager identityProviderManager) {
IdentityProviderManager identityProviderManager,
UserService userService) {
super(extensionGrant.getGrantType());
setTokenService(tokenService);
setTokenRequestResolver(tokenRequestResolver);
Expand All @@ -71,6 +74,7 @@ public ExtensionGrantGranter(ExtensionGrantProvider extensionGrantProvider,
this.extensionGrant = extensionGrant;
this.userAuthenticationManager = userAuthenticationManager;
this.identityProviderManager = identityProviderManager;
this.userService = userService;
}

@Override
Expand Down Expand Up @@ -124,6 +128,7 @@ protected Maybe<User> resolveResourceOwner(TokenRequest tokenRequest, Client cli
user.setRoles(idpUser.getRoles());
return user;
})
.flatMap(user -> userService.enhanceRolesPermissions(user).toMaybe())
.switchIfEmpty(Maybe.error(new InvalidGrantException("Unknown user: " + endUser.getId())));
} else {
User user = new User();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import io.gravitee.am.common.event.ExtensionGrantEvent;
import io.gravitee.am.gateway.handler.common.auth.UserAuthenticationManager;
import io.gravitee.am.gateway.handler.common.auth.idp.IdentityProviderManager;
import io.gravitee.am.gateway.handler.common.user.UserService;
import io.gravitee.am.gateway.handler.oauth2.service.granter.CompositeTokenGranter;
import io.gravitee.am.gateway.handler.oauth2.service.granter.TokenGranter;
import io.gravitee.am.gateway.handler.oauth2.service.granter.extensiongrant.ExtensionGrantGranter;
Expand Down Expand Up @@ -81,6 +82,9 @@ public class ExtensionGrantManagerImpl extends AbstractService implements Extens

@Autowired
private EventManager eventManager;

@Autowired
private UserService userService;

@Override
public void afterPropertiesSet() {
Expand Down Expand Up @@ -163,7 +167,7 @@ private void updateExtensionGrantProvider(ExtensionGrant extensionGrant) {
}
ExtensionGrantProvider extensionGrantProvider = extensionGrantPluginManager.create(extensionGrant.getType(), extensionGrant.getConfiguration(), authenticationProvider);
ExtensionGrantGranter extensionGrantGranter = new ExtensionGrantGranter(extensionGrantProvider, extensionGrant,
userAuthenticationManager, tokenService, tokenRequestResolver, identityProviderManager);
userAuthenticationManager, tokenService, tokenRequestResolver, identityProviderManager, userService);
// backward compatibility, set min date to the extension grant granter to choose the good one for the old clients
extensionGrantGranter.setMinDate(minDate);
((CompositeTokenGranter) tokenGranter).addTokenGranter(extensionGrant.getId(), extensionGrantGranter);
Expand Down