com.caricah.iotracah.core.security.DefaultSecurityHandler.java Source code

Java tutorial

Introduction

Here is the source code for com.caricah.iotracah.core.security.DefaultSecurityHandler.java

Source

/*
 *
 * Copyright (c) 2015 Caricah <info@caricah.com>.
 *
 * Caricah licenses this file to you under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. You may obtain a copy
 *  of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software distributed under
 *  the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
 *  OF ANY  KIND, either express or implied.  See the License for the specific language
 *  governing permissions and limitations under the License.
 *
 *
 *
 *
 */

package com.caricah.iotracah.core.security;

import com.caricah.iotracah.bootstrap.exceptions.UnRetriableException;
import com.caricah.iotracah.bootstrap.security.IOTIniSecurityManagerFactory;
import com.caricah.iotracah.bootstrap.security.IOTSecurityManager;
import com.caricah.iotracah.bootstrap.security.realm.IOTSecurityDatastore;
import com.caricah.iotracah.bootstrap.system.ResourceFileUtil;
import org.apache.commons.configuration.Configuration;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.config.Ini;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.SessionListener;
import org.apache.shiro.session.mgt.DefaultSessionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.HashSet;
import java.util.Set;

/**
 * @author <a href="mailto:bwire@caricah.com"> Peter Bwire </a>
 * @version 1.0 6/7/15
 */
public class DefaultSecurityHandler {

    private static final Logger log = LoggerFactory.getLogger(DefaultSecurityHandler.class);

    public static final String CONFIGURATION_VALUE_DEFAULT_SECURITY_FILE_NAME = "security.ini";

    public static final String SYSTEM_CONFIG_SECURITY_CONFIG_DIRECTORY = "system.config.security.config.directory";
    public static final String SYSTEM_CONFIG_SECURITY_CONFIG_DIRECTORY_DEFAULT_VALUE = "";

    public static final String CONFIG_SYSTEM_SECURITY_DEFAULT_PARTITION_NAME = "config.system.security.default.partition.name";
    public static final String CONFIG_SYSTEM_SECURITY_DEFAULT_PARTITION_NAME_VALUE_DEFAULT = "default_partition";

    private final String securityFileName;
    private String securityFileDirectory;
    private String defaultPartitionName;

    private IOTSecurityDatastore iotSecurityDatastore;

    private Set<SessionListener> sessionListenerList = new HashSet<>();

    public DefaultSecurityHandler() {
        this.securityFileName = CONFIGURATION_VALUE_DEFAULT_SECURITY_FILE_NAME;
    }

    public DefaultSecurityHandler(String securityFileName) {
        this.securityFileName = securityFileName;
    }

    public String getSecurityFileName() {
        return securityFileName;
    }

    public String getSecurityFileDirectory() {
        return securityFileDirectory;
    }

    public void setSecurityFileDirectory(String securityFileDirectory) {
        this.securityFileDirectory = securityFileDirectory;
    }

    public IOTSecurityDatastore getIotSecurityDatastore() {
        return iotSecurityDatastore;
    }

    public void setIotSecurityDatastore(IOTSecurityDatastore iotSecurityDatastore) {
        this.iotSecurityDatastore = iotSecurityDatastore;
    }

    public String getDefaultPartitionName() {
        return defaultPartitionName;
    }

    public void setDefaultPartitionName(String defaultPartitionName) {
        this.defaultPartitionName = defaultPartitionName;
    }

    public Set<SessionListener> getSessionListenerList() {
        return sessionListenerList;
    }

    public String getSecurityIniPath() throws UnRetriableException {

        File securityFile = new File(getSecurityFileDirectory() + File.separator + getSecurityFileName());

        if (!securityFile.exists()) {

            log.warn(
                    " getSecurityIniPath : Security file not found in the configurations directory. Falling back to the defaults");

            securityFile = ResourceFileUtil.getFileFromResource(getClass(), getSecurityFileName());

            return securityFile.getPath();

        } else {
            return securityFile.getPath();
        }

    }

    public void configure(Configuration configuration) {

        String securityFileDirectory = System.getProperty("iotracah.default.path.conf",
                SYSTEM_CONFIG_SECURITY_CONFIG_DIRECTORY_DEFAULT_VALUE);

        securityFileDirectory = configuration.getString(SYSTEM_CONFIG_SECURITY_CONFIG_DIRECTORY,
                securityFileDirectory);

        setSecurityFileDirectory(securityFileDirectory);

        String defaultPartitionName = configuration.getString(CONFIG_SYSTEM_SECURITY_DEFAULT_PARTITION_NAME,
                CONFIG_SYSTEM_SECURITY_DEFAULT_PARTITION_NAME_VALUE_DEFAULT);
        setDefaultPartitionName(defaultPartitionName);

    }

    public SecurityManager createSecurityManager(String securityFilePath) throws UnRetriableException {

        Ini ini = new Ini();
        ini.loadFromPath(securityFilePath);

        IOTIniSecurityManagerFactory iniSecurityManagerFactory = new IOTIniSecurityManagerFactory(ini,
                getIotSecurityDatastore(), getDefaultPartitionName());

        SecurityManager securityManager = iniSecurityManagerFactory.getInstance();

        if (securityManager instanceof IOTSecurityManager) {

            //configure the security manager.
            IOTSecurityManager iotSecurityManager = (IOTSecurityManager) securityManager;
            DefaultSessionManager sessionManager = (DefaultSessionManager) iotSecurityManager.getSessionManager();

            SecurityUtils.setSecurityManager(iotSecurityManager);

            //Assign session dao from the security datastore.
            sessionManager.setSessionDAO(getIotSecurityDatastore());

            sessionManager.setSessionListeners(getSessionListenerList());
            sessionManager.setSessionValidationSchedulerEnabled(true);
            sessionManager.setSessionValidationInterval(1000);

            return securityManager;

        } else {
            throw new UnRetriableException(
                    "Security manager has to be an instance of the default security manager (DefaultSecurityManager). "
                            + securityManager.getClass().getName() + " was used instead.");
        }
    }

}