org.kitodo.services.security.SessionService.java Source code

Java tutorial

Introduction

Here is the source code for org.kitodo.services.security.SessionService.java

Source

/*
 * (c) Kitodo. Key to digital objects e. V. <contact@kitodo.org>
 *
 * This file is part of the Kitodo project.
 *
 * It is licensed under GNU General Public License version 3 or later.
 *
 * For the full copyright and license information, please read the
 * GPL3-License.txt file that was distributed with this source code.
 */

package org.kitodo.services.security;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import org.joda.time.LocalDateTime;
import org.kitodo.security.SecurityConfig;
import org.kitodo.security.SecuritySession;
import org.kitodo.security.SecurityUserDetails;
import org.springframework.security.core.session.SessionInformation;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.ldap.userdetails.LdapUserDetails;
import org.springframework.security.ldap.userdetails.LdapUserDetailsImpl;

public class SessionService {

    private static SessionService instance = null;
    private SessionRegistry sessionRegistry;

    private SessionService() {
        SecurityConfig securityConfig = SecurityConfig.getInstance();
        this.sessionRegistry = securityConfig.getSessionRegistry();
    }

    /**
     * Expires all active sessions of a spring security UserDetails object.
     *
     * @param user
     *            The UserDetails Object.
     */
    public void expireSessionsOfUser(UserDetails user) {
        List<SessionInformation> activeUserSessions = sessionRegistry.getAllSessions(user, false);
        for (SessionInformation sessionInformation : activeUserSessions) {
            sessionInformation.expireNow();
        }
    }

    /**
     * Gets all active sessions.
     *
     * @return The active sessions.
     */
    public List<SecuritySession> getActiveSessions() {

        List<Object> allPrincipals = sessionRegistry.getAllPrincipals();

        List<SecuritySession> activeSessions = new ArrayList<>();

        UserDetails user = null;

        for (final Object principal : allPrincipals) {

            if (principal instanceof LdapUserDetails) {
                user = (LdapUserDetailsImpl) principal;
            }
            if (principal instanceof SecurityUserDetails) {
                user = (SecurityUserDetails) principal;
            }
            if (user != null) {
                List<SessionInformation> activeSessionInformation = new ArrayList<>(
                        sessionRegistry.getAllSessions(principal, false));

                for (SessionInformation sessionInformation : activeSessionInformation) {
                    SecuritySession securitySession = new SecuritySession();
                    securitySession.setUserName(user.getUsername());
                    securitySession.setSessionId(sessionInformation.getSessionId());
                    securitySession.setLastRequest(new LocalDateTime(sessionInformation.getLastRequest()));

                    activeSessions.add(securitySession);
                }
            }
        }
        return activeSessions;
    }

    /**
     * Return singleton variable of type SessionService.
     *
     * @return unique instance of SessionService
     */
    public static SessionService getInstance() {
        if (Objects.equals(instance, null)) {
            synchronized (SessionService.class) {
                if (Objects.equals(instance, null)) {
                    instance = new SessionService();
                }
            }
        }
        return instance;
    }
}