All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sap.cds.feature.xsuaa.XsuaaRequestUserProvider Maven / Gradle / Ivy

/**************************************************************************
 * (C) 2019-2020 SAP SE or an SAP affiliate company. All rights reserved. *
 **************************************************************************/
package com.sap.cds.feature.xsuaa;

import static com.sap.cds.feature.xsuaa.XsUaaToken.GrantType.CLIENT_CREDENTIALS;
import static com.sap.cds.feature.xsuaa.XsUaaToken.GrantType.CLIENT_X509;

import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sap.cds.feature.auth.RequestUserProvider;
import com.sap.cds.feature.config.Properties;
import com.sap.cds.feature.platform.PlatformEnvironment;
import com.sap.cds.feature.platform.ServiceBinding;
import com.sap.cds.services.runtime.RequestUser;

public class XsuaaRequestUserProvider implements RequestUserProvider {

	private final static Logger logger = LoggerFactory.getLogger(XsuaaRequestUserProvider.class);

	private final static ServiceBinding uaaInstance = PlatformEnvironment.INSTANCE.getServiceBindings().filter(b -> b.getTags().contains("xsuaa")).findFirst().orElseGet(() -> null);

	@Override
	public RequestUser extract(String authenticatedUserClaim) {
		if(authenticatedUserClaim == null) {
			return null;
		}

		XsUaaToken jwt = XsUaaToken.parse(authenticatedUserClaim);
		logger.debug("Decoded XSUAA JWT token: {}", jwt.toString());

		return new XsUaaRequestUser(jwt);
	}

	private static class XsUaaRequestUser implements RequestUser {

		private final XsUaaToken jwt;

		private final List roles;

		private final static String UnrestrictedAttribute = "$unrestricted";

		private XsUaaRequestUser(XsUaaToken jwt) {
			this.jwt = jwt;

			// filter the "$XSAPPNAME." prefix
			String scopePrefix = (String) uaaInstance.getCredentials().get("xsappname");
			roles = jwt.getScopes().stream().map(scope -> {
				int pos = scope.indexOf(scopePrefix + ".");
				if (pos == 0) {
					return scope.substring(scopePrefix.length() + 1);
				}
				return scope;
			}).collect(Collectors.toList());
		}

		@Override
		public String getId() {
			return jwt.getId();
		}

		@Override
		public String getName() {
			String name = jwt.getName();
			if (name != null && Properties.getCds().getSecurity().getXsuaa().isNormalizeUserNames()) {
				name = jwt.getName().trim().toLowerCase(Locale.ENGLISH);
			}
			return name;
		}

		@Override
		public List getRoles() {
			return roles; // NOSONAR
		}

		@Override
		public String getTenant() {
			return jwt.getTenant();
		}

		@Override
		public boolean isSystemUser() {
			return 	jwt.getGrantType() != null && (
					jwt.getGrantType().equals(CLIENT_CREDENTIALS.toString()) || jwt.getGrantType().equals(CLIENT_X509.toString()) );
		}

		@Override
		public List getUserAttribute(String attribute) {
			return jwt.getUserAttributes().get(attribute);
		}

		@Override
		public List getSystemAttribute(String attribute) {
			return jwt.getSystemAttributes().get(attribute);
		}

		@Override
		public Object getExtensionAttribute(String attribute) {
			return jwt.getExtensionAttributes().get(attribute);
		}

		@Override
		public Map getAdditionalAttributes() {
			return jwt.getAdditionalAttributes();
		}

		@Override
		public boolean isUnrestrictedUserAttribute(String attribute) {
			List attributeValues = jwt.getUserAttributes().get(attribute);
			return attributeValues != null && attributeValues.stream().anyMatch(UnrestrictedAttribute::equalsIgnoreCase);
		}
	}

	@Override
	public boolean isActiveFeature() {
		return Properties.getCds().getSecurity().getXsuaa().isEnabled() && uaaInstance != null;
	}

	@Override
	public String getFeatureName() {
		return "XSUAA Token Parser (" + uaaInstance.getServiceInstanceName() +  ")";
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy