Search in sources :

Example 1 with UserDetailRole

use of io.gravitee.rest.api.idp.api.authentication.UserDetailRole in project gravitee-management-rest-api by gravitee-io.

the class CurrentUserResource method getCurrentUser.

@GET
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Get the authenticated user")
@ApiResponses({ @ApiResponse(code = 200, message = "Authenticated user", response = UserDetails.class), @ApiResponse(code = 401, message = "Unauthorized user"), @ApiResponse(code = 500, message = "Internal server error") })
public Response getCurrentUser() {
    if (isAuthenticated()) {
        final UserDetails details = getAuthenticatedUserDetails();
        final String userId = details.getUsername();
        final String password = details.getPassword() != null ? details.getPassword() : "";
        UserEntity userEntity;
        try {
            userEntity = userService.findByIdWithRoles(userId);
        } catch (final UserNotFoundException unfe) {
            final String unfeMessage = "User '{}' does not exist.";
            if (LOG.isDebugEnabled()) {
                LOG.info(unfeMessage, userId, unfe);
            } else {
                LOG.info(unfeMessage, userId);
            }
            response.addCookie(cookieGenerator.generate(TokenAuthenticationFilter.AUTH_COOKIE_NAME, null));
            return status(Response.Status.UNAUTHORIZED).build();
        }
        List<GrantedAuthority> authorities = new ArrayList<>(details.getAuthorities());
        UserDetails userDetails = new UserDetails(userEntity.getId(), password, authorities);
        userDetails.setId(userEntity.getId());
        // in case of memory user, look at the repository layer to get value updated by the user through the MyAccount page
        userDetails.setFirstname(IDP_SOURCE_MEMORY.equals(userEntity.getSource()) && userEntity.getFirstname() != null ? userEntity.getFirstname() : details.getFirstname());
        userDetails.setLastname(IDP_SOURCE_MEMORY.equals(userEntity.getSource()) && userEntity.getLastname() != null ? userEntity.getLastname() : details.getLastname());
        userDetails.setSource(userEntity.getSource());
        userDetails.setSourceId(userEntity.getSourceId());
        userDetails.setPrimaryOwner(userEntity.isPrimaryOwner());
        userDetails.setCreatedAt(userEntity.getCreatedAt());
        userDetails.setUpdatedAt(userEntity.getUpdatedAt());
        userDetails.setLastConnectionAt(userEntity.getLastConnectionAt());
        if (details.getEmail() == null && IDP_SOURCE_MEMORY.equals(userEntity.getSource()) && userEntity.getEmail() != null) {
            userDetails.setEmail(userEntity.getEmail());
        } else {
            userDetails.setEmail(details.getEmail());
        }
        boolean newsletterEnabled = environment.getProperty("newsletter.enabled", boolean.class, true);
        if (newsletterEnabled && userEntity.getNewsletterSubscribed() == null && userEntity.getFirstConnectionAt() != null) {
            long diffInMs = Math.abs(new Date().getTime() - userEntity.getFirstConnectionAt().getTime());
            long diff = TimeUnit.DAYS.convert(diffInMs, TimeUnit.MILLISECONDS);
            userDetails.setDisplayNewsletterSubscription(diff >= 7);
        } else {
            userDetails.setDisplayNewsletterSubscription(false);
        }
        // convert UserEntityRoles to UserDetailsRoles
        userDetails.setRoles(userEntity.getRoles().stream().map(userEntityRole -> {
            UserDetailRole userDetailRole = new UserDetailRole();
            userDetailRole.setScope(userEntityRole.getScope().name());
            userDetailRole.setName(userEntityRole.getName());
            userDetailRole.setPermissions(userEntityRole.getPermissions());
            return userDetailRole;
        }).collect(Collectors.toList()));
        final Set<MembershipEntity> memberships = membershipService.getMembershipsByMemberAndReference(MembershipMemberType.USER, userId, MembershipReferenceType.GROUP);
        if (!memberships.isEmpty()) {
            final Map<String, Set<String>> userGroups = new HashMap<>();
            environmentService.findByOrganization(GraviteeContext.getCurrentOrganization()).forEach(environment -> {
                try {
                    final Set<Group> groups = groupRepository.findAllByEnvironment(environment.getId());
                    userGroups.put(environment.getId(), new HashSet<>());
                    memberships.stream().map(MembershipEntity::getReferenceId).forEach(groupId -> {
                        final Optional<Group> optionalGroup = groups.stream().filter(group -> groupId.equals(group.getId())).findFirst();
                        optionalGroup.ifPresent(entity -> userGroups.get(environment.getId()).add(entity.getName()));
                    });
                    userDetails.setGroupsByEnvironment(userGroups);
                } catch (TechnicalException e) {
                    LOG.error("Error while trying to get groups of the user " + userId, e);
                }
            });
        }
        userDetails.setFirstLogin(1 == userEntity.getLoginCount());
        if (userEntity.getCustomFields() != null) {
            userDetails.setCustomFields(userEntity.getCustomFields());
        }
        return ok(userDetails, MediaType.APPLICATION_JSON).build();
    } else {
        return ok().build();
    }
}
Also used : UserNotFoundException(io.gravitee.rest.api.service.exceptions.UserNotFoundException) PagedResult(io.gravitee.rest.api.management.rest.model.PagedResult) BEARER(io.gravitee.rest.api.management.rest.model.TokenType.BEARER) TechnicalException(io.gravitee.repository.exceptions.TechnicalException) LoggerFactory(org.slf4j.LoggerFactory) UserNotFoundException(io.gravitee.rest.api.service.exceptions.UserNotFoundException) Valid(javax.validation.Valid) ApiOperation(io.swagger.annotations.ApiOperation) Algorithm(com.auth0.jwt.algorithms.Algorithm) CookieGenerator(io.gravitee.rest.api.security.cookies.CookieGenerator) TokenEntity(io.gravitee.rest.api.management.rest.model.TokenEntity) Duration(java.time.Duration) Response.status(javax.ws.rs.core.Response.status) AbstractResource(io.gravitee.rest.api.management.rest.resource.AbstractResource) URI(java.net.URI) UserDetailRole(io.gravitee.rest.api.idp.api.authentication.UserDetailRole) SecurityContextHolder(org.springframework.security.core.context.SecurityContextHolder) Context(javax.ws.rs.core.Context) GroupRepository(io.gravitee.repository.management.api.GroupRepository) Instant(java.time.Instant) NotNull(javax.validation.constraints.NotNull) UserDetails(io.gravitee.rest.api.idp.api.authentication.UserDetails) Collectors(java.util.stream.Collectors) GrantedAuthority(org.springframework.security.core.GrantedAuthority) MediaType(io.gravitee.common.http.MediaType) InvalidImageException(io.gravitee.rest.api.exception.InvalidImageException) javax.ws.rs(javax.ws.rs) Response(javax.ws.rs.core.Response) Response.ok(javax.ws.rs.core.Response.ok) DEFAULT_JWT_EXPIRE_AFTER(io.gravitee.rest.api.service.common.JWTHelper.DefaultValues.DEFAULT_JWT_EXPIRE_AFTER) Request(javax.ws.rs.core.Request) Authentication(org.springframework.security.core.Authentication) JWT(com.auth0.jwt.JWT) io.gravitee.rest.api.service(io.gravitee.rest.api.service) java.util(java.util) ByteArrayOutputStream(java.io.ByteArrayOutputStream) GraviteeContext(io.gravitee.rest.api.service.common.GraviteeContext) ApiResponses(io.swagger.annotations.ApiResponses) Inject(javax.inject.Inject) ConfigurableEnvironment(org.springframework.core.env.ConfigurableEnvironment) Claims(io.gravitee.rest.api.service.common.JWTHelper.Claims) io.gravitee.rest.api.model(io.gravitee.rest.api.model) TokensResource(io.gravitee.rest.api.management.rest.resource.TokensResource) Api(io.swagger.annotations.Api) Cookie(javax.servlet.http.Cookie) Logger(org.slf4j.Logger) ImageUtils(io.gravitee.rest.api.security.utils.ImageUtils) HttpServletResponse(javax.servlet.http.HttpServletResponse) Group(io.gravitee.repository.management.model.Group) EntityTag(javax.ws.rs.core.EntityTag) Maps(io.gravitee.common.util.Maps) TimeUnit(java.util.concurrent.TimeUnit) DEFAULT_JWT_ISSUER(io.gravitee.rest.api.service.common.JWTHelper.DefaultValues.DEFAULT_JWT_ISSUER) TokenAuthenticationFilter(io.gravitee.rest.api.security.filter.TokenAuthenticationFilter) ApiResponse(io.swagger.annotations.ApiResponse) ResourceContext(javax.ws.rs.container.ResourceContext) JWTHelper(io.gravitee.rest.api.service.common.JWTHelper) Group(io.gravitee.repository.management.model.Group) TechnicalException(io.gravitee.repository.exceptions.TechnicalException) GrantedAuthority(org.springframework.security.core.GrantedAuthority) UserDetailRole(io.gravitee.rest.api.idp.api.authentication.UserDetailRole) UserDetails(io.gravitee.rest.api.idp.api.authentication.UserDetails) ApiOperation(io.swagger.annotations.ApiOperation) ApiResponses(io.swagger.annotations.ApiResponses)

Aggregations

JWT (com.auth0.jwt.JWT)1 Algorithm (com.auth0.jwt.algorithms.Algorithm)1 MediaType (io.gravitee.common.http.MediaType)1 Maps (io.gravitee.common.util.Maps)1 TechnicalException (io.gravitee.repository.exceptions.TechnicalException)1 GroupRepository (io.gravitee.repository.management.api.GroupRepository)1 Group (io.gravitee.repository.management.model.Group)1 InvalidImageException (io.gravitee.rest.api.exception.InvalidImageException)1 UserDetailRole (io.gravitee.rest.api.idp.api.authentication.UserDetailRole)1 UserDetails (io.gravitee.rest.api.idp.api.authentication.UserDetails)1 PagedResult (io.gravitee.rest.api.management.rest.model.PagedResult)1 TokenEntity (io.gravitee.rest.api.management.rest.model.TokenEntity)1 BEARER (io.gravitee.rest.api.management.rest.model.TokenType.BEARER)1 AbstractResource (io.gravitee.rest.api.management.rest.resource.AbstractResource)1 TokensResource (io.gravitee.rest.api.management.rest.resource.TokensResource)1 io.gravitee.rest.api.model (io.gravitee.rest.api.model)1 CookieGenerator (io.gravitee.rest.api.security.cookies.CookieGenerator)1 TokenAuthenticationFilter (io.gravitee.rest.api.security.filter.TokenAuthenticationFilter)1 ImageUtils (io.gravitee.rest.api.security.utils.ImageUtils)1 io.gravitee.rest.api.service (io.gravitee.rest.api.service)1