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

com.microsoft.sqlserver.jdbc.PersistentTokenCacheAccessAspect Maven / Gradle / Ivy

There is a newer version: 12.7.1.jre11-preview
Show newest version
/*
 * Microsoft JDBC Driver for SQL Server Copyright(c) Microsoft Corporation All rights reserved. This program is made
 * available under the terms of the MIT License. See the LICENSE file in the project root for more information.
 */

package com.microsoft.sqlserver.jdbc;

import com.microsoft.aad.msal4j.ITokenCacheAccessAspect;
import com.microsoft.aad.msal4j.ITokenCacheAccessContext;


/**
 * Access aspect for accessing the token cache.
 * 
 * MSAL token cache does not persist beyond lifetime of the application. This class implements the
 * ITokenCacheAccessAspect interface to persist the token cache between application instances so subsequent
 * authentications can use silent authentication if the user account is in the token cache.
 * 
 * @see https://aka.ms/msal4j-token-cache
 */
public class PersistentTokenCacheAccessAspect implements ITokenCacheAccessAspect {
    private static PersistentTokenCacheAccessAspect instance = new PersistentTokenCacheAccessAspect();

    private PersistentTokenCacheAccessAspect() {};

    static PersistentTokenCacheAccessAspect getInstance() {
        return instance;
    }

    /**
     * Token cache in JSON format
     */
    private String cache = null;

    @Override
    public synchronized void beforeCacheAccess(ITokenCacheAccessContext iTokenCacheAccessContext) {
        if (null != cache && null != iTokenCacheAccessContext && null != iTokenCacheAccessContext.tokenCache()) {
            iTokenCacheAccessContext.tokenCache().deserialize(cache);
        }
    }

    @Override
    public synchronized void afterCacheAccess(ITokenCacheAccessContext iTokenCacheAccessContext) {
        if (null != iTokenCacheAccessContext && iTokenCacheAccessContext.hasCacheChanged()
                && null != iTokenCacheAccessContext.tokenCache())
            cache = iTokenCacheAccessContext.tokenCache().serialize();
    }

    /**
     * Clears User token cache. This will clear all account info so interactive login will be required on the next
     * request to acquire an access token.
     */
    static void clearUserTokenCache() {
        if (null != instance.cache && !instance.cache.isEmpty()) {
            instance.cache = null;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy