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

org.paranora.ssoc.configuration.DefaultShiroConfigurer Maven / Gradle / Ivy

package org.paranora.ssoc.configuration;

import org.pac4j.core.engine.SecurityLogic;
import org.paranora.ssoc.cas.validation.BasicCas30ServiceTicketValidator;
import org.paranora.ssoc.pac4j.authenticator.BasicJwtAuthenticator;
import org.paranora.ssoc.pac4j.cas.config.BasicCasConfiguration;
import org.paranora.ssoc.pac4j.client.BasicCasRestFormClient;
import org.paranora.ssoc.pac4j.client.BasicHeaderClient;
import org.paranora.ssoc.pac4j.profile.BasicJwtGenerator;
import org.paranora.ssoc.pac4j.realm.BasicCasRealm;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.pac4j.cas.config.CasProtocol;
import org.pac4j.core.client.Client;
import org.pac4j.core.client.Clients;
import org.pac4j.core.config.Config;
import org.pac4j.core.util.Pac4jConstants;
import org.pac4j.jwt.config.encryption.SecretEncryptionConfiguration;
import org.pac4j.jwt.config.signature.SecretSignatureConfiguration;
import org.paranora.ssoc.shiro.property.ShiroConfigurationProperties;
import org.springframework.util.ObjectUtils;

import javax.servlet.Filter;
import java.util.*;

/**
 * The type Default shiro configurer.
 *
 * @param  the type parameter
 */
public abstract class DefaultShiroConfigurer implements ShiroConfigurer {

    @Override
    public void configure(T config) {

        BasicCasConfiguration casConfiguration = generateCasConfiguration(config);
        config.setCasConfiguration(casConfiguration);

        BasicJwtGenerator jwtGenerator = generateJwtGenerator(config);
        config.setJwtGenerator(jwtGenerator);

        BasicJwtAuthenticator jwtAuthenticator = generateJwtAuthenticator(config);
        config.setJwtAuthenticator(jwtAuthenticator);

        BasicCasRestFormClient casRestFormClient = generateCasRestFormClient(config);
        config.setCasRestFormClient(casRestFormClient);
//
//        BasicHeaderClient headerClient = generateHeaderClient(config);
//        config.setHeaderClient(headerClient);

        config.setClients(generateClients(config));

        config.setClientsObj(generateClientsObj(config));

        config.setClients(generateClients(config));

        config.setCasConfig(generateConfig(config));

        config.setRealms(generateRealms(config));

        config.setShiroFilters(generateShiroFilters(config));

        ShiroFilterChainDefinition shiroFilterChainDefinition = generateShiroFilterChainDefinition(config);
        config.setShiroFilterChainDefinition(shiroFilterChainDefinition);
    }

    /**
     * Default security filter filter.
     *
     * @param config the config
     * @return the filter
     */
    protected abstract Filter defaultSecurityFilter(T config);

    /**
     * Default security logic security logic.
     *
     * @return the security logic
     */
    protected abstract SecurityLogic defaultSecurityLogic();

    /**
     * Generate client names string.
     *
     * @param config the config
     * @return the string
     */
    protected String generateClientNames(T config) {
        List names = new ArrayList<>();
        for (Client it : config.getClients().values()) {
            names.add(it.getName());
        }
        return StringUtils.join(names, ",");
    }

    /**
     * Generate config config.
     *
     * @param config the config
     * @return the config
     */
    protected Config generateConfig(T config) {
        Config casConf = new Config();
        casConf.setClients(config.getClientsObj());
        return casConf;
    }

    /**
     * Generate jwt generator basic jwt generator.
     *
     * @param config the config
     * @return the basic jwt generator
     */
    protected BasicJwtGenerator generateJwtGenerator(T config) {
        ShiroConfigurationProperties.JwtConfiguration jwt = config.getConfig().getJwt();
        if (ObjectUtils.isEmpty(jwt)) return null;
        BasicJwtGenerator generator = new BasicJwtGenerator(new SecretSignatureConfiguration(jwt.getSalt()), new SecretEncryptionConfiguration(jwt.getSalt()));
        generator.setExpiresTime(jwt.getExpiresTime());
        return generator;
    }

    /**
     * Generate jwt authenticator basic jwt authenticator.
     *
     * @param config the config
     * @return the basic jwt authenticator
     */
    protected BasicJwtAuthenticator generateJwtAuthenticator(T config) {
        ShiroConfigurationProperties.JwtConfiguration jwt = config.getConfig().getJwt();
        if (ObjectUtils.isEmpty(jwt)) return null;
        BasicJwtAuthenticator authenticator = new BasicJwtAuthenticator();
        authenticator.addSignatureConfiguration(new SecretSignatureConfiguration(jwt.getSalt()));
        authenticator.addEncryptionConfiguration(new SecretEncryptionConfiguration(jwt.getSalt()));
        return authenticator;
    }

    /**
     * Generate cas configuration basic cas configuration.
     *
     * @param config the config
     * @return the basic cas configuration
     */
    protected BasicCasConfiguration generateCasConfiguration(T config) {
        ShiroConfigurationProperties.CasConfiguration cas = config.getConfig().getCas();
        if (ObjectUtils.isEmpty(cas)) return null;
        BasicCasConfiguration casConfig = new BasicCasConfiguration();
        casConfig.setProtocol(CasProtocol.CAS30);
        casConfig.setPrefixUrl(cas.getServer().getServiceUrl());
        casConfig.setLoginUrl(cas.getServer().getLoginUrl());
        casConfig.setDefaultTicketValidator(new BasicCas30ServiceTicketValidator(cas.getServer().getServiceUrl(), config.getRestOperations()));
        casConfig.setAcceptAnyProxy(true);
        return casConfig;
    }

    /**
     * Generate cas rest form client basic cas rest form client.
     *
     * @param config the config
     * @return the basic cas rest form client
     */
    protected BasicCasRestFormClient generateCasRestFormClient(T config) {
        BasicCasConfiguration casConfig = config.getCasConfiguration();
        BasicCasRestFormClient client = new BasicCasRestFormClient(casConfig, Pac4jConstants.USERNAME, Pac4jConstants.PASSWORD, config.getRestOperations());
        client.setName("rest");
        return client;
    }

//    @Bean
//    public BasicParameterClient parameterClient(BasicJwtAuthenticator jwtAuthenticator) {
//        BasicParameterClient parameterClient = new BasicParameterClient("token", jwtAuthenticator);
//        parameterClient.setSupportGetRequest(true);
//        parameterClient.setName("jwt");
//        return parameterClient;
//    }

    /**
     * Generate header client basic header client.
     *
     * @param config the config
     * @return the basic header client
     */
    protected BasicHeaderClient generateHeaderClient(T config) {
        BasicJwtAuthenticator jwtAuthenticator = config.getJwtAuthenticator();
        BasicHeaderClient client = new BasicHeaderClient("token", jwtAuthenticator);
        client.setName("jwt");
        return client;
    }

    /**
     * Generate clients obj clients.
     *
     * @param config the config
     * @return the clients
     */
    protected Clients generateClientsObj(T config) {
        List clientList = new ArrayList<>();
        Map defaultClient = config.getClients();
        putMapToList(defaultClient, clientList);
        Clients clients = new Clients();
        clients.setClients(clientList);
        return clients;
    }

    /**
     * Put map to list.
     *
     * @param   the type parameter
     * @param map  the map
     * @param list the list
     */
    protected  void putMapToList(Map map, List list) {
        if (null != map && map.size() > 0) {
            if (null != list) {
                list.addAll(map.values());
            }
        }
    }

    /**
     * Generate clients map.
     *
     * @param config the config
     * @return the map
     */
    protected Map generateClients(T config) {
        Map clientList = new HashMap<>();
        Map defaultClient = generateDefaultClient(config);
        Map customClient = generateCustomClient(config);
        putMapToMap(defaultClient, clientList);
        putMapToMap(customClient, clientList);
        return clientList;
    }

    /**
     * Generate default client map.
     *
     * @param config the config
     * @return the map
     */
    protected Map generateDefaultClient(T config) {
        return null;
    }

    /**
     * Generate custom client map.
     *
     * @param config the config
     * @return the map
     */
    protected Map generateCustomClient(T config) {
        return null;
    }

    /**
     * Generate cas realm basic cas realm.
     *
     * @return the basic cas realm
     */
    protected BasicCasRealm generateCasRealm() {
        BasicCasRealm realm = new BasicCasRealm();
        return realm;
    }

    /**
     * Put map to map.
     *
     * @param   the type parameter
     * @param maps the maps
     * @param mapt the mapt
     */
    protected  void putMapToMap(Map maps, Map mapt) {
        if (null != maps && maps.size() > 0) {
            if (null != mapt) {
                mapt.putAll(maps);
            }
        }
    }

    /**
     * Generate realms map.
     *
     * @param config the config
     * @return the map
     */
    protected Map generateRealms(T config) {
        Map realms = new HashMap<>();
        Map defaultRealms = generateDefaultRealms(config);
        Map customRealms = generateCustomRealms(config);
        putMapToMap(defaultRealms, realms);
        putMapToMap(customRealms, realms);
        return realms;
    }

    /**
     * Generate default realms map.
     *
     * @param config the config
     * @return the map
     */
    protected Map generateDefaultRealms(T config) {
        BasicCasRealm casRealm = generateCasRealm();
        Map realms = new HashMap<>();
        realms.put("casRealm", casRealm);
        return realms;
    }

    /**
     * Generate custom realms map.
     *
     * @param config the config
     * @return the map
     */
    protected Map generateCustomRealms(T config) {
        return null;
    }

    /**
     * Generate default shiro filters map.
     *
     * @param config the config
     * @return the map
     */
    protected abstract Map generateDefaultShiroFilters(T config);

    /**
     * Generate custom shiro filters map.
     *
     * @param config the config
     * @return the map
     */
    protected abstract Map generateCustomShiroFilters(T config);

    /**
     * Generate shiro filters map.
     *
     * @param config the config
     * @return the map
     */
    protected Map generateShiroFilters(T config) {
        Map filter = new HashMap<>();
        filter.putAll(generateDefaultShiroFilters(config));
        filter.putAll(generateCustomShiroFilters(config));
        return filter;
    }

    /**
     * Generate shiro filter chain definition shiro filter chain definition.
     *
     * @param config the config
     * @return the shiro filter chain definition
     */
    protected ShiroFilterChainDefinition generateShiroFilterChainDefinition(T config) {
        DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();
        definition.addPathDefinitions(config.getConfig().getFilter());
        return definition;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy