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

pl.fhframework.accounts.SingleLoginLockManager Maven / Gradle / Ivy

package pl.fhframework.accounts;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import pl.fhframework.WebSocketSessionManager;
import pl.fhframework.configuration.FHConfiguration;

import java.util.HashSet;
import java.util.Objects;

import javax.annotation.PreDestroy;

/**
 * Created by pawel.ruta on 2017-02-27.
 */
@Service
public class SingleLoginLockManager {
    @Autowired
    private SingleLoginLockCache singleLoginLockCache;

    @Autowired
    FHConfiguration fhConfiguration;

    @Value("${fh.single.login:true}")
    private Boolean turnedOn;

    public void assignUserLogin(String userName, String sessionId) {
        if (isTrunedOn()) {
            synchronized (WebSocketSessionManager.getHttpSession()) {
                if (!containsKey(userName)) {
                    singleLoginLockCache.update(userName, sessionId);
                    return;
                }
                throw new RuntimeException("User is already logged");
            }
        }
    }

    private boolean containsKey(String userName) {
        return singleLoginLockCache.get(userName) != null;
    }

    public boolean releaseUserLogin(String userName, String sessionId) {
        if (isTrunedOn()) {
            synchronized (WebSocketSessionManager.getHttpSession()) {
                if (sessionId.equals(singleLoginLockCache.get(userName))) {
                    singleLoginLockCache.update(userName, null);
                    return true;
                }
            }
        }
        return false;
    }

    public boolean isLoggedIn(String userName) {
        return containsKey(userName);
    }

    public boolean isLoggedInWithDifferentSession(String userName, String sessionId) {
        String currentSessionId = singleLoginLockCache.get(userName);
        return currentSessionId != null && !Objects.equals(currentSessionId, sessionId);
    }

    public boolean isLoggedInWithTheSameSession(String userName, String sessionId) {
        return sessionId.equals(singleLoginLockCache.get(userName));
    }

    @Scheduled(cron = "*/3 * * * * *")
    public void updateTtl() {
        for (String userName : new HashSet<>(singleLoginLockCache.keySet())) {
            String sessionId = singleLoginLockCache.getNoCache(userName);
            if (sessionId != null) {
                singleLoginLockCache.update(userName, sessionId);
            }
        }
    }

    @PreDestroy
    protected void onExit() {
        for (String userName : new HashSet<>(singleLoginLockCache.keySet())) {
            String sessionId = singleLoginLockCache.getNoCache(userName);
            if (sessionId != null) {
                singleLoginLockCache.update(userName, null);
            }
        }
    }

    public boolean isTrunedOn() {
        return fhConfiguration.isProdModeActive() && turnedOn;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy