/** * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mifosplatform.infrastructure.security.api; import java.util.ArrayList; import java.util.Collection; import java.util.Set; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer; import org.mifosplatform.infrastructure.security.data.AuthenticatedOauthUserData; import org.mifosplatform.infrastructure.security.service.SpringSecurityPlatformSecurityContext; import org.mifosplatform.useradministration.data.RoleData; import org.mifosplatform.useradministration.domain.AppUser; import org.mifosplatform.useradministration.domain.Role; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Scope; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices; import org.springframework.stereotype.Component; /* * Implementation of Oauth2 authentication APIs, loaded only when "oauth" profile is enabled. */ @Path("/userdetails") @Component @Profile("oauth") @Scope("singleton") public class UserDetailsApiResource { private final ResourceServerTokenServices tokenServices; private final ToApiJsonSerializer<AuthenticatedOauthUserData> apiJsonSerializerService; private final SpringSecurityPlatformSecurityContext springSecurityPlatformSecurityContext; @Autowired public UserDetailsApiResource(@Qualifier("tokenServices") final ResourceServerTokenServices tokenServices, final ToApiJsonSerializer<AuthenticatedOauthUserData> apiJsonSerializerService, final SpringSecurityPlatformSecurityContext springSecurityPlatformSecurityContext) { this.tokenServices = tokenServices; this.apiJsonSerializerService = apiJsonSerializerService; this.springSecurityPlatformSecurityContext = springSecurityPlatformSecurityContext; } @GET @Produces({ MediaType.APPLICATION_JSON }) public String fetchAuthenticatedUserData(@QueryParam("access_token") final String accessToken) { final Authentication authentication = this.tokenServices.loadAuthentication(accessToken); if (authentication.isAuthenticated()) { final AppUser principal = (AppUser) authentication.getPrincipal(); final Collection<String> permissions = new ArrayList<>(); AuthenticatedOauthUserData authenticatedUserData = new AuthenticatedOauthUserData(principal.getUsername(), permissions); final Collection<GrantedAuthority> authorities = new ArrayList<>(authentication.getAuthorities()); for (final GrantedAuthority grantedAuthority : authorities) { permissions.add(grantedAuthority.getAuthority()); } final Collection<RoleData> roles = new ArrayList<>(); final Set<Role> userRoles = principal.getRoles(); for (final Role role : userRoles) { roles.add(role.toData()); } final Long officeId = principal.getOffice().getId(); final String officeName = principal.getOffice().getName(); final Long staffId = principal.getStaffId(); final String staffDisplayName = principal.getStaffDisplayName(); final EnumOptionData organisationalRole = principal.organisationalRoleData(); if (this.springSecurityPlatformSecurityContext.doesPasswordHasToBeRenewed(principal)) { authenticatedUserData = new AuthenticatedOauthUserData(principal.getUsername(), principal.getId(), accessToken); } else { authenticatedUserData = new AuthenticatedOauthUserData(principal.getUsername(), officeId, officeName, staffId, staffDisplayName, organisationalRole, roles, permissions, principal.getId(), accessToken); } return this.apiJsonSerializerService.serialize(authenticatedUserData); } return null; } }