/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.module.spring.security.config;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toList;
import static org.mule.runtime.dsl.api.component.AttributeDefinition.Builder.fromChildCollectionConfiguration;
import static org.mule.runtime.dsl.api.component.AttributeDefinition.Builder.fromReferenceObject;
import static org.mule.runtime.dsl.api.component.AttributeDefinition.Builder.fromSimpleParameter;
import static org.mule.runtime.dsl.api.component.AttributeDefinition.Builder.fromSimpleReferenceParameter;
import static org.mule.runtime.dsl.api.component.TypeDefinition.fromType;
import static org.mule.runtime.module.spring.security.config.MuleSecurityXmlNamespaceInfoProvider.MULE_SS_NAMESPACE;
import org.mule.runtime.core.api.MuleContext;
import org.mule.runtime.core.api.security.SecurityManager;
import org.mule.runtime.core.api.security.SecurityProvider;
import org.mule.runtime.core.processor.SecurityFilterMessageProcessor;
import org.mule.runtime.dsl.api.component.ComponentBuildingDefinition;
import org.mule.runtime.dsl.api.component.ComponentBuildingDefinitionProvider;
import org.mule.runtime.module.spring.security.SpringProviderAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* {@link ComponentBuildingDefinition} definitions for the components provided by the mule
* spring security module.
*
* @since 4.0
*/
public class MuleSecurityComponentBuildingDefinitionProvider implements ComponentBuildingDefinitionProvider {
@Override
public void init() {}
@Override
public List<ComponentBuildingDefinition> getComponentBuildingDefinitions() {
List<ComponentBuildingDefinition> componentBuildingDefinitions = new ArrayList<>();
ComponentBuildingDefinition.Builder baseDefinition =
new ComponentBuildingDefinition.Builder().withNamespace(MULE_SS_NAMESPACE);
componentBuildingDefinitions.add(baseDefinition.copy().withIdentifier("security-manager")
.withTypeDefinition(fromType(SecurityManager.class)).withObjectFactoryType(MuleSecurityManagerConfigurator.class)
.withSetterParameterDefinition("muleContext", fromReferenceObject(MuleContext.class).build())
.withSetterParameterDefinition("name", fromSimpleParameter("name").build())
.withSetterParameterDefinition("providers", fromChildCollectionConfiguration(SecurityProvider.class).build()).build());
componentBuildingDefinitions.add(baseDefinition.copy().withIdentifier("delegate-security-provider")
.withTypeDefinition(fromType(SpringProviderAdapter.class))
.withSetterParameterDefinition("name", fromSimpleParameter("name").build())
.withSetterParameterDefinition("securityProperties", fromChildCollectionConfiguration(SecurityProperty.class).build())
.withSetterParameterDefinition("delegate", fromSimpleReferenceParameter("delegate-ref").build())
.withSetterParameterDefinition("authenticationProvider",
fromSimpleReferenceParameter("authenticationProvider-ref").build())
.build());
componentBuildingDefinitions
.add(baseDefinition.copy().withIdentifier("security-property").withTypeDefinition(fromType(SecurityProperty.class))
.withConstructorParameterDefinition(fromSimpleParameter("name").build())
.withConstructorParameterDefinition(fromSimpleParameter("value").build()).build());
componentBuildingDefinitions.add(baseDefinition.copy().withIdentifier("authorization-filter")
.withTypeDefinition(fromType(SecurityFilterMessageProcessor.class))
.withObjectFactoryType(AuthorizationFilterObjectFactory.class)
.withConstructorParameterDefinition(fromSimpleParameter("requiredAuthorities",
(value) -> asList(((String) value).split(",")).stream()
.map(String::trim).collect(toList())).build())
.build());
return componentBuildingDefinitions;
}
}