package org.jboss.seam.security.management.picketlink; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.RequestScoped; import javax.enterprise.event.Event; import javax.enterprise.inject.Instance; import javax.enterprise.inject.Produces; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import javax.inject.Inject; import javax.persistence.EntityManager; import org.picketlink.idm.api.IdentitySession; import org.picketlink.idm.api.IdentitySessionFactory; import org.picketlink.idm.api.cfg.IdentityConfiguration; import org.picketlink.idm.api.event.EventListener; import org.picketlink.idm.common.exception.IdentityConfigurationException; import org.picketlink.idm.common.exception.IdentityException; import org.picketlink.idm.impl.configuration.IdentityConfigurationImpl; import org.picketlink.idm.impl.configuration.metadata.IdentityConfigurationMetaDataImpl; import org.picketlink.idm.impl.configuration.metadata.IdentityRepositoryConfigurationMetaDataImpl; import org.picketlink.idm.impl.configuration.metadata.IdentityStoreConfigurationMetaDataImpl; import org.picketlink.idm.impl.configuration.metadata.IdentityStoreMappingMetaDataImpl; import org.picketlink.idm.impl.configuration.metadata.RealmConfigurationMetaDataImpl; import org.picketlink.idm.impl.repository.WrapperIdentityStoreRepository; import org.picketlink.idm.spi.configuration.metadata.IdentityConfigurationMetaData; import org.picketlink.idm.spi.configuration.metadata.IdentityRepositoryConfigurationMetaData; import org.picketlink.idm.spi.configuration.metadata.IdentityStoreConfigurationMetaData; import org.picketlink.idm.spi.configuration.metadata.IdentityStoreMappingMetaData; import org.picketlink.idm.spi.configuration.metadata.RealmConfigurationMetaData; /** * Produces IdentitySession instances for identity management-related operations * * @author Shane Bryzak */ @ApplicationScoped public class IdentitySessionProducer implements EventListener { public static final String SESSION_OPTION_ENTITY_MANAGER = "ENTITY_MANAGER"; public static final String SESSION_OPTION_IDENTITY_OBJECT_CREATED_EVENT = "IDENTITY_OBJECT_CREATED_EVENT"; private String defaultRealm = "default"; private String defaultAttributeStoreId; private String defaultIdentityStoreId; IdentityConfigurationMetaData metadata; // Flag that indicates whether any identity stores have been configured. private boolean configured; @Inject BeanManager manager; @Inject public void init() throws IdentityConfigurationException, IdentityException { metadata = new IdentityConfigurationMetaDataImpl(); // Create the identity store configuration List<IdentityStoreConfigurationMetaData> stores = new ArrayList<IdentityStoreConfigurationMetaData>(); String defaultStoreId = null; Set<Bean<?>> storeBeans = manager.getBeans(IdentityStoreConfiguration.class); for (Bean<?> storeBean : storeBeans) { IdentityStoreConfiguration config = (IdentityStoreConfiguration) manager .getReference(storeBean, IdentityStoreConfiguration.class, manager.createCreationalContext(storeBean)); if (config.isConfigured()) { IdentityStoreConfigurationMetaDataImpl storeConfig = new IdentityStoreConfigurationMetaDataImpl(); config.configure(storeConfig); stores.add(storeConfig); if (defaultStoreId == null && storeConfig.getId() != null) { defaultStoreId = storeConfig.getId(); } } } ((IdentityConfigurationMetaDataImpl) metadata).setIdentityStores(stores); // Create the default realm RealmConfigurationMetaDataImpl realm = new RealmConfigurationMetaDataImpl(); realm.setId(getDefaultRealm()); realm.setIdentityMapping("USER"); //realm.setGroupTypeMappings(groupTypeMappings) realm.setOptions(new HashMap<String, List<String>>()); List<RealmConfigurationMetaData> realms = new ArrayList<RealmConfigurationMetaData>(); realms.add(realm); ((IdentityConfigurationMetaDataImpl) metadata).setRealms(realms); if (stores.size() > 0) { List<IdentityRepositoryConfigurationMetaData> repositories = new ArrayList<IdentityRepositoryConfigurationMetaData>(); IdentityRepositoryConfigurationMetaDataImpl repository = new IdentityRepositoryConfigurationMetaDataImpl(); repository.setClassName(WrapperIdentityStoreRepository.class.getName()); repository.setDefaultAttributeStoreId(defaultAttributeStoreId != null ? defaultAttributeStoreId : defaultStoreId); repository.setDefaultIdentityStoreId(defaultIdentityStoreId != null ? defaultIdentityStoreId : defaultStoreId); List<IdentityStoreMappingMetaData> mappings = new ArrayList<IdentityStoreMappingMetaData>(); IdentityStoreMappingMetaDataImpl mapping = new IdentityStoreMappingMetaDataImpl(); List<String> identityObjectTypes = new ArrayList<String>(); identityObjectTypes.add("USER"); identityObjectTypes.add("GROUP"); mapping.setIdentityObjectTypeMappings(identityObjectTypes); mapping.setIdentityStoreId(defaultIdentityStoreId != null ? defaultIdentityStoreId : defaultStoreId); mappings.add(mapping); repository.setIdentityStoreToIdentityObjectTypeMappings(mappings); repositories.add(repository); ((IdentityConfigurationMetaDataImpl) metadata).setRepositories(repositories); configured = true; } } /** * This method can be used to determine whether identity management has been configured for the application. * * @return */ public boolean isConfigured() { return configured; } @Inject Instance<EntityManager> entityManagerInstance; @Inject Event<IdentityObjectCreatedEvent> identityObjectCreatedEvent; @Produces public IdentitySessionFactory produceFactory() throws IdentityConfigurationException { IdentityConfigurationImpl config = new IdentityConfigurationImpl(); config.configure(metadata); return config.buildIdentitySessionFactory(); } @Produces @RequestScoped IdentitySession createIdentitySession(IdentitySessionFactory factory) throws IdentityException { if (metadata.getRepositories() == null || metadata.getRepositories().size() == 0) { throw new IdentityException("Error creating IdentitySession - no PicketLink IdentityStore repositories have been configured."); } Map<String, Object> sessionOptions = new HashMap<String, Object>(); if (!entityManagerInstance.isUnsatisfied() && !entityManagerInstance.isAmbiguous()) { sessionOptions.put(SESSION_OPTION_ENTITY_MANAGER, entityManagerInstance.get()); sessionOptions.put(SESSION_OPTION_IDENTITY_OBJECT_CREATED_EVENT, identityObjectCreatedEvent); } IdentitySession session = factory.createIdentitySession(getDefaultRealm(), sessionOptions); session.registerListener(this); return session; } public String getDefaultRealm() { return defaultRealm; } public void setDefaultRealm(String defaultRealm) { this.defaultRealm = defaultRealm; } public String getDefaultAttributeStoreId() { return defaultAttributeStoreId; } public void setDefaultAttributeStoreId(String defaultAttributeStoreId) { this.defaultAttributeStoreId = defaultAttributeStoreId; } public String getDefaultIdentityStoreId() { return defaultIdentityStoreId; } public void setDefaultIdentityStoreId(String defaultIdentityStoreId) { this.defaultIdentityStoreId = defaultIdentityStoreId; } }