MultiTenantUtil.java

package com.tradecloud.authentication;

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;

import java.util.HashMap;
import java.util.Map;

public final class MultiTenantUtil {

    private static Client client;
    private static final Map<String, String> urlHost = new HashMap<>();

    private MultiTenantUtil() {
    }

    /**
     * Get the active client ID (used to determine the datasource among other things).
     */
    public static String getActiveClient() {
        if (SecurityContextHolder.getContext().getAuthentication() != null) {
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            if (principal instanceof User) {
                return ((User) principal).getActiveClient();
            }
            if (principal instanceof CustomOAuth2User) {
                return ((CustomOAuth2User) principal).getUser().getActiveClient();
            } else {
                return null;
            }
        }
        return null;

    }

    /**
     * Get the active logged-in user.
     */
    public static User getActiveUser() {
        if (SecurityContextHolder.getContext().getAuthentication() != null) {
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            if (principal instanceof User) {
                return (User) principal;
            }
            if (principal instanceof CustomOAuth2User) {
                return ((CustomOAuth2User) principal).getUser();
            } else {
                return null;
            }
        }
        return null;
    }

    public static boolean isOAuthActiveUser() {
        if (SecurityContextHolder.getContext().getAuthentication() != null) {
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            return principal instanceof CustomOAuth2User;
        }
        return false;
    }

    /**
     * Set the active logged-in user.
     */
    public static void setActiveUser(User principal, Client client) {
        UsernamePasswordAuthenticationToken authentication =
                new UsernamePasswordAuthenticationToken(principal, principal.getPassword(), principal.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }

    public static void setActiveUser2(CustomOAuth2User principal, String clientId) {
        OAuth2AuthenticationToken authentication =
                new OAuth2AuthenticationToken(principal, principal.getAuthorities(), clientId);
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }

    public static void clearActiveUser() {
        SecurityContextHolder.getContext().setAuthentication(null);
    }

    public static Client getClient() {
        return new Client(getActiveUser().getActiveClient());
    }

    public static String getUrlHost(String client) {
        return urlHost.get(client);
    }

    public static void setUrlHost(String client, String urlHost) {
        MultiTenantUtil.urlHost.put(client, urlHost);
    }
}