You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2019/04/02 13:07:41 UTC

[syncope] branch master updated: [SYNCOPE-1410] Allowing Groovy implementations for SAML2SP ext

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new dd1e088  [SYNCOPE-1410] Allowing Groovy implementations for SAML2SP ext
dd1e088 is described below

commit dd1e08852870bcb52968c75ea23f8501e9f01c65
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Tue Apr 2 15:07:30 2019 +0200

    [SYNCOPE-1410] Allowing Groovy implementations for SAML2SP ext
---
 .../lib/types/ImplementationTypesHolder.java       |  4 -
 .../console/wizards/OIDCProviderWizardBuilder.java |  2 +-
 .../lib/types/OIDCClientImplementationType.java    |  4 +-
 .../persistence/jpa/entity/JPAOIDCProvider.java    |  2 +-
 .../client/console/rest/SAML2IdPsRestClient.java   |  9 ---
 .../console/wizards/SAML2IdPWizardBuilder.java     | 46 ++++++++----
 .../panels/SAML2IdPsDirectoryPanel.properties      |  4 +-
 .../panels/SAML2IdPsDirectoryPanel_it.properties   |  4 +-
 .../SAML2IdPsDirectoryPanel_pt_BR.properties       |  4 +-
 .../panels/SAML2IdPsDirectoryPanel_ru.properties   |  4 +-
 .../apache/syncope/common/lib/to/SAML2IdPTO.java   | 20 ++---
 .../lib/types/SAML2SPImplementationType.java}      | 13 +++-
 .../apache/syncope/core/logic/SAML2IdPLogic.java   | 17 +----
 .../apache/syncope/core/logic/SAML2SPLogic.java    | 15 ++--
 .../SAML2SPClassPathScanImplementationLookup.java  | 87 ----------------------
 .../syncope/core/logic/init/SAML2SPLoader.java     |  3 +
 .../syncope/core/logic/saml2/SAML2IdPEntity.java   |  8 +-
 .../syncope/core/logic/saml2/SAML2UserManager.java | 18 ++---
 .../core/persistence/api/entity/SAML2IdP.java      |  8 +-
 .../core/persistence/jpa/entity/JPASAML2IdP.java   | 42 +++++++----
 .../java/data/SAML2IdPDataBinderImpl.java          | 36 +++++++--
 .../common/rest/api/service/SAML2IdPService.java   | 21 ------
 .../core/rest/cxf/service/SAML2IdPServiceImpl.java | 11 ---
 23 files changed, 151 insertions(+), 231 deletions(-)

diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ImplementationTypesHolder.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ImplementationTypesHolder.java
index 5ef7d81..780ec8c 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ImplementationTypesHolder.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/types/ImplementationTypesHolder.java
@@ -50,8 +50,4 @@ public final class ImplementationTypesHolder {
     public Map<String, String> getValues() {
         return Collections.unmodifiableMap(values);
     }
-
-//    public String getClass(final String implementationType) {
-//        return values.get(implementationType);
-//    }
 }
diff --git a/ext/oidcclient/client-console/src/main/java/org/apache/syncope/client/console/wizards/OIDCProviderWizardBuilder.java b/ext/oidcclient/client-console/src/main/java/org/apache/syncope/client/console/wizards/OIDCProviderWizardBuilder.java
index 73ad117..0278d89 100644
--- a/ext/oidcclient/client-console/src/main/java/org/apache/syncope/client/console/wizards/OIDCProviderWizardBuilder.java
+++ b/ext/oidcclient/client-console/src/main/java/org/apache/syncope/client/console/wizards/OIDCProviderWizardBuilder.java
@@ -71,7 +71,7 @@ public class OIDCProviderWizardBuilder extends AjaxWizardBuilder<OIDCProviderTO>
 
         @Override
         protected List<String> load() {
-            return implRestClient.list(OIDCClientImplementationType.OP_ACTION).stream().
+            return implRestClient.list(OIDCClientImplementationType.OP_ACTIONS).stream().
                     map(EntityTO::getKey).sorted().collect(Collectors.toList());
         }
     };
diff --git a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/types/OIDCClientImplementationType.java b/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/types/OIDCClientImplementationType.java
index ca94cec..895c3eb 100644
--- a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/types/OIDCClientImplementationType.java
+++ b/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/types/OIDCClientImplementationType.java
@@ -23,10 +23,10 @@ import org.apache.commons.lang3.tuple.Pair;
 
 public final class OIDCClientImplementationType {
 
-    public static final String OP_ACTION = "OP_ACTION";
+    public static final String OP_ACTIONS = "OP_ACTIONS";
 
     private static final Map<String, String> VALUES = Map.ofEntries(
-            Pair.of(OP_ACTION, "org.apache.syncope.core.provisioning.api.OIDCProviderActions"));
+            Pair.of(OP_ACTIONS, "org.apache.syncope.core.provisioning.api.OIDCProviderActions"));
 
     public static Map<String, String> values() {
         return VALUES;
diff --git a/ext/oidcclient/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAOIDCProvider.java b/ext/oidcclient/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAOIDCProvider.java
index ae748b4..556ea97 100644
--- a/ext/oidcclient/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAOIDCProvider.java
+++ b/ext/oidcclient/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAOIDCProvider.java
@@ -269,7 +269,7 @@ public class JPAOIDCProvider extends AbstractGeneratedKeyEntity implements OIDCP
     @Override
     public boolean add(final Implementation action) {
         checkType(action, JPAImplementation.class);
-        checkImplementationType(action, OIDCClientImplementationType.OP_ACTION);
+        checkImplementationType(action, OIDCClientImplementationType.OP_ACTIONS);
         return actions.contains((JPAImplementation) action) || actions.add((JPAImplementation) action);
     }
 
diff --git a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/rest/SAML2IdPsRestClient.java b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/rest/SAML2IdPsRestClient.java
index 06090a0..b38963f 100644
--- a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/rest/SAML2IdPsRestClient.java
+++ b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/rest/SAML2IdPsRestClient.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.rest;
 
 import java.io.InputStream;
 import java.util.List;
-import java.util.Set;
 import javax.ws.rs.core.MediaType;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.common.lib.to.SAML2IdPTO;
@@ -34,14 +33,6 @@ public class SAML2IdPsRestClient extends BaseRestClient {
         return getService(SAML2IdPService.class).list();
     }
 
-    public Set<String> getActionsClasses() {
-        return getService(SAML2IdPService.class).getActionsClasses();
-    }
-
-    public Set<String> getRequestedAuthnContextProviderClasses() {
-        return getService(SAML2IdPService.class).getRequestedAuthnContextProviderClasses();
-    }
-
     public void importIdPs(final InputStream input) {
         SyncopeConsoleSession.get().
                 getService(MediaType.APPLICATION_XML_TYPE, SAML2IdPService.class).importFromMetadata(input);
diff --git a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPWizardBuilder.java b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPWizardBuilder.java
index 65d17cf..aca0f5e 100644
--- a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPWizardBuilder.java
+++ b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPWizardBuilder.java
@@ -24,11 +24,13 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.SyncopeWebApplication;
 import org.apache.syncope.client.console.panels.SAML2IdPsDirectoryPanel;
+import org.apache.syncope.client.console.rest.ImplementationRestClient;
 import org.apache.syncope.client.console.rest.SAML2IdPsRestClient;
 import org.apache.syncope.client.console.wizards.resources.JEXLTransformersTogglePanel;
 import org.apache.syncope.client.console.wizards.resources.ItemTransformersTogglePanel;
@@ -39,9 +41,11 @@ import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
 import org.apache.syncope.client.ui.commons.wizards.AjaxWizardBuilder;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.ItemTO;
 import org.apache.syncope.common.lib.to.SAML2IdPTO;
 import org.apache.syncope.common.lib.types.SAML2BindingType;
+import org.apache.syncope.common.lib.types.SAML2SPImplementationType;
 import org.apache.wicket.Component;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.extensions.wizard.WizardModel;
@@ -61,15 +65,29 @@ public class SAML2IdPWizardBuilder extends AjaxWizardBuilder<SAML2IdPTO> {
 
     private final SAML2IdPsRestClient restClient = new SAML2IdPsRestClient();
 
+    private final ImplementationRestClient implRestClient = new ImplementationRestClient();
+
     private final SAML2IdPsDirectoryPanel directoryPanel;
 
-    private final IModel<List<String>> actionsClasses = new LoadableDetachableModel<List<String>>() {
+    private final IModel<List<String>> idpActions = new LoadableDetachableModel<List<String>>() {
 
         private static final long serialVersionUID = 5275935387613157437L;
 
         @Override
         protected List<String> load() {
-            return new ArrayList<>(restClient.getActionsClasses());
+            return implRestClient.list(SAML2SPImplementationType.IDP_ACTIONS).stream().
+                    map(EntityTO::getKey).sorted().collect(Collectors.toList());
+        }
+    };
+
+    private final IModel<List<String>> requestedAuthnContextProviders = new LoadableDetachableModel<List<String>>() {
+
+        private static final long serialVersionUID = 4659376149825914247L;
+
+        @Override
+        protected List<String> load() {
+            return implRestClient.list(SAML2SPImplementationType.REQUESTED_AUTHN_CONTEXT_PROVIDER).stream().
+                    map(EntityTO::getKey).sorted().collect(Collectors.toList());
         }
     };
 
@@ -159,21 +177,21 @@ public class SAML2IdPWizardBuilder extends AjaxWizardBuilder<SAML2IdPTO> {
             bindingType.setChoices(Arrays.asList(SAML2BindingType.values()));
             fields.add(bindingType);
 
-            AjaxTextFieldPanel requestedAuthnContextProviderClassName = new AjaxTextFieldPanel(
-                    "field", "requestedAuthnContextProviderClassName",
-                    new PropertyModel<>(idpTO, "requestedAuthnContextProviderClassName"));
-            requestedAuthnContextProviderClassName.setChoices(
-                    new ArrayList<>(restClient.getRequestedAuthnContextProviderClasses()));
-            fields.add(requestedAuthnContextProviderClassName);
+            AjaxTextFieldPanel requestedAuthnContextProvider = new AjaxTextFieldPanel(
+                    "field", "requestedAuthnContextProvider",
+                    new PropertyModel<>(idpTO, "requestedAuthnContextProvider"));
+            requestedAuthnContextProvider.setChoices(
+                    requestedAuthnContextProviders.getObject());
+            fields.add(requestedAuthnContextProvider);
 
-            AjaxPalettePanel<String> actionsClassNames = new AjaxPalettePanel.Builder<String>().
+            AjaxPalettePanel<String> actions = new AjaxPalettePanel.Builder<String>().
                     setAllowMoveAll(true).setAllowOrder(true).
-                    setName(new StringResourceModel("actionsClassNames", directoryPanel).getString()).
+                    setName(new StringResourceModel("actions", directoryPanel).getString()).
                     build("field",
-                            new PropertyModel<>(idpTO, "actionsClassNames"),
-                            new ListModel<>(actionsClasses.getObject()));
-            actionsClassNames.setOutputMarkupId(true);
-            fields.add(actionsClassNames);
+                            new PropertyModel<>(idpTO, "actions"),
+                            new ListModel<>(idpActions.getObject()));
+            actions.setOutputMarkupId(true);
+            fields.add(actions);
 
             add(new ListView<Component>("fields", fields) {
 
diff --git a/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.properties b/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.properties
index 3010eaa..79aee53 100644
--- a/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.properties
+++ b/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.properties
@@ -24,7 +24,7 @@ bindingType=Binding
 html.title=metadata
 createUnmatching=Create unmatching users
 updateMatching=Update matching users
-actionsClassNames=Actions
+actions=Actions
 template.title=user template
 selfRegUnmatching=SAML-initiated self-registration
-requestedAuthnContextProviderClassName=RequestedAuthnContext provider
+requestedAuthnContextProvider=RequestedAuthnContext provider
diff --git a/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_it.properties b/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_it.properties
index fe2dc04..6b5ed3a 100644
--- a/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_it.properties
+++ b/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_it.properties
@@ -24,7 +24,7 @@ bindingType=Binding
 html.title=metadata
 createUnmatching=Create unmatching users
 updateMatching=Update matching users
-actionsClassNames=Azioni
+actions=Azioni
 template.title=template utenti
 selfRegUnmatching=SAML-initiated self-registration
-requestedAuthnContextProviderClassName=RequestedAuthnContext provider
+requestedAuthnContextProvider=RequestedAuthnContext provider
diff --git a/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_pt_BR.properties b/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_pt_BR.properties
index 9f4b9b0..cb586cd 100644
--- a/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_pt_BR.properties
+++ b/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_pt_BR.properties
@@ -24,7 +24,7 @@ bindingType=Binding
 html.title=metadata
 createUnmatching=Create unmatching users
 updateMatching=Update matching users
-actionsClassNames=Actions
+actions=Actions
 template.title=user template
 selfRegUnmatching=SAML-initiated self-registration
-requestedAuthnContextProviderClassName=RequestedAuthnContext provider
+requestedAuthnContextProvider=RequestedAuthnContext provider
diff --git a/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_ru.properties b/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_ru.properties
index e8de69f..cae8696 100644
--- a/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_ru.properties
+++ b/ext/saml2sp/client-console/src/main/resources/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel_ru.properties
@@ -24,7 +24,7 @@ bindingType=Binding
 html.title=metadata
 createUnmatching=Create unmatching users
 updateMatching=Update matching users
-actionsClassNames=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
+actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
 template.title=user template
 selfRegUnmatching=SAML-initiated self-registration
-requestedAuthnContextProviderClassName=RequestedAuthnContext provider
+requestedAuthnContextProvider=RequestedAuthnContext provider
diff --git a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java
index 76b3259..13dc87a 100644
--- a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java
+++ b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java
@@ -60,9 +60,9 @@ public class SAML2IdPTO implements EntityTO, ItemContainerTO {
 
     private final List<ItemTO> items = new ArrayList<>();
 
-    private final List<String> actionsClassNames = new ArrayList<>();
+    private final List<String> actions = new ArrayList<>();
 
-    private String requestedAuthnContextProviderClassName;
+    private String requestedAuthnContextProvider;
 
     @Override
     public String getKey() {
@@ -199,18 +199,18 @@ public class SAML2IdPTO implements EntityTO, ItemContainerTO {
         return this.items.remove(item);
     }
 
-    @XmlElementWrapper(name = "actionsClassNames")
-    @XmlElement(name = "actionsClassNames")
+    @XmlElementWrapper(name = "actions")
+    @XmlElement(name = "action")
     @JsonProperty("actions")
-    public List<String> getActionsClassNames() {
-        return actionsClassNames;
+    public List<String> getActions() {
+        return actions;
     }
 
-    public String getRequestedAuthnContextProviderClassName() {
-        return requestedAuthnContextProviderClassName;
+    public String getRequestedAuthnContextProvider() {
+        return requestedAuthnContextProvider;
     }
 
-    public void setRequestedAuthnContextProviderClassName(final String requestedAuthnContextProviderClassName) {
-        this.requestedAuthnContextProviderClassName = requestedAuthnContextProviderClassName;
+    public void setRequestedAuthnContextProvider(final String requestedAuthnContextProvider) {
+        this.requestedAuthnContextProvider = requestedAuthnContextProvider;
     }
 }
diff --git a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/types/OIDCClientImplementationType.java b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/types/SAML2SPImplementationType.java
similarity index 68%
copy from ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/types/OIDCClientImplementationType.java
copy to ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/types/SAML2SPImplementationType.java
index ca94cec..acda3b3 100644
--- a/ext/oidcclient/common-lib/src/main/java/org/apache/syncope/common/lib/types/OIDCClientImplementationType.java
+++ b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/types/SAML2SPImplementationType.java
@@ -21,18 +21,23 @@ package org.apache.syncope.common.lib.types;
 import java.util.Map;
 import org.apache.commons.lang3.tuple.Pair;
 
-public final class OIDCClientImplementationType {
+public final class SAML2SPImplementationType {
 
-    public static final String OP_ACTION = "OP_ACTION";
+    public static final String IDP_ACTIONS = "IDP_ACTIONS";
+
+    public static final String REQUESTED_AUTHN_CONTEXT_PROVIDER = "REQUESTED_AUTHN_CONTEXT_PROVIDER";
 
     private static final Map<String, String> VALUES = Map.ofEntries(
-            Pair.of(OP_ACTION, "org.apache.syncope.core.provisioning.api.OIDCProviderActions"));
+            Pair.of(IDP_ACTIONS,
+                    "org.apache.syncope.core.provisioning.api.SAML2IdPActions"),
+            Pair.of(REQUESTED_AUTHN_CONTEXT_PROVIDER,
+                    "org.apache.syncope.core.provisioning.api.RequestedAuthnContextProvider"));
 
     public static Map<String, String> values() {
         return VALUES;
     }
 
-    private OIDCClientImplementationType() {
+    private SAML2SPImplementationType() {
         // private constructor for static utility class
     }
 }
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java
index ef9d2c5..753337d 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java
@@ -26,7 +26,6 @@ import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Base64;
 import java.util.List;
-import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -35,10 +34,9 @@ import org.apache.syncope.common.lib.to.SAML2IdPTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.SAML2BindingType;
 import org.apache.syncope.common.lib.types.SAML2SPEntitlement;
-import org.apache.syncope.core.logic.init.SAML2SPClassPathScanImplementationLookup;
-import org.apache.syncope.core.logic.saml2.SAML2ReaderWriter;
 import org.apache.syncope.core.logic.saml2.SAML2IdPCache;
 import org.apache.syncope.core.logic.saml2.SAML2IdPEntity;
+import org.apache.syncope.core.logic.saml2.SAML2ReaderWriter;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.SAML2IdPDAO;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdP;
@@ -69,21 +67,8 @@ public class SAML2IdPLogic extends AbstractSAML2Logic<SAML2IdPTO> {
     private SAML2IdPDAO idpDAO;
 
     @Autowired
-    private SAML2SPClassPathScanImplementationLookup implLookup;
-
-    @Autowired
     private SAML2ReaderWriter saml2rw;
 
-    @PreAuthorize("isAuthenticated()")
-    public Set<String> getActionsClasses() {
-        return implLookup.getActionsClasses();
-    }
-
-    @PreAuthorize("isAuthenticated()")
-    public Set<String> getRequestedAuthnContextProviderClasses() {
-        return implLookup.getRequestedAuthnContextProvidersClasses();
-    }
-
     private SAML2IdPTO complete(final SAML2IdP idp, final SAML2IdPTO idpTO) {
         SAML2IdPEntity idpEntity = cache.get(idpTO.getEntityID());
         if (idpEntity == null) {
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java
index 7fd659b..3977db6 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java
@@ -50,6 +50,7 @@ import org.apache.syncope.core.logic.saml2.SAML2IdPCache;
 import org.apache.syncope.core.logic.saml2.SAML2IdPEntity;
 import org.apache.syncope.core.logic.saml2.SAML2UserManager;
 import org.apache.syncope.core.persistence.api.dao.AccessTokenDAO;
+import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.SAML2IdPDAO;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdP;
@@ -98,13 +99,12 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 import org.apache.syncope.core.provisioning.java.DefaultRequestedAuthnContextProvider;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
+import org.apache.syncope.core.spring.ImplementationManager;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.spring.security.AuthDataAccessor;
 import org.apache.syncope.core.spring.security.Encryptor;
 import org.apache.syncope.core.spring.security.SecureRandomUtils;
 import org.opensaml.core.xml.schema.XSAny;
-import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.util.ResourceUtils;
 
 @Component
@@ -142,6 +142,9 @@ public class SAML2SPLogic extends AbstractSAML2Logic<EntityTO> {
     private AccessTokenDAO accessTokenDAO;
 
     @Autowired
+    private ImplementationDAO implementationDAO;
+
+    @Autowired
     private AuthDataAccessor authDataAccessor;
 
     @Autowired
@@ -294,14 +297,12 @@ public class SAML2SPLogic extends AbstractSAML2Logic<EntityTO> {
         nameIDPolicy.setSPNameQualifier(spEntityID);
 
         RequestedAuthnContextProvider requestedAuthnContextProvider = new DefaultRequestedAuthnContextProvider();
-        if (idp.getRequestedAuthnContextProviderClassName() != null) {
+        if (idp.getRequestedAuthnContextProvider() != null) {
             try {
-                Class<?> actionsClass = Class.forName(idp.getRequestedAuthnContextProviderClassName());
-                requestedAuthnContextProvider = (RequestedAuthnContextProvider) ApplicationContextProvider.
-                        getBeanFactory().createBean(actionsClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
+                ImplementationManager.build(implementationDAO.find(idp.getRequestedAuthnContextProvider()));
             } catch (Exception e) {
                 LOG.warn("Cannot instantiate '{}', reverting to {}",
-                        idp.getRequestedAuthnContextProviderClassName(),
+                        idp.getRequestedAuthnContextProvider(),
                         DefaultRequestedAuthnContextProvider.class.getName(), e);
             }
         }
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPClassPathScanImplementationLookup.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPClassPathScanImplementationLookup.java
deleted file mode 100644
index 24ce2a3..0000000
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPClassPathScanImplementationLookup.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF 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 org.apache.syncope.core.logic.init;
-
-import java.lang.reflect.Modifier;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import org.apache.syncope.core.persistence.api.ImplementationLookup;
-import org.apache.syncope.core.persistence.api.SyncopeCoreLoader;
-import org.apache.syncope.core.provisioning.api.RequestedAuthnContextProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
-import org.springframework.core.type.filter.AssignableTypeFilter;
-import org.springframework.stereotype.Component;
-import org.springframework.util.ClassUtils;
-import org.apache.syncope.core.provisioning.api.SAML2IdPActions;
-
-@Component
-public class SAML2SPClassPathScanImplementationLookup implements SyncopeCoreLoader {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ImplementationLookup.class);
-
-    private static final String DEFAULT_BASE_PACKAGE = "org.apache.syncope.core";
-
-    private Set<String> actionsClasses;
-
-    private Set<String> requestedAuthnContextProvidersClasses;
-
-    @Override
-    public int getOrder() {
-        return 999;
-    }
-
-    @Override
-    public void load() {
-        actionsClasses = new HashSet<>();
-        requestedAuthnContextProvidersClasses = new HashSet<>();
-
-        ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
-        scanner.addIncludeFilter(new AssignableTypeFilter(SAML2IdPActions.class));
-        scanner.addIncludeFilter(new AssignableTypeFilter(RequestedAuthnContextProvider.class));
-
-        scanner.findCandidateComponents(DEFAULT_BASE_PACKAGE).forEach(bd -> {
-            try {
-                Class<?> clazz = ClassUtils.resolveClassName(bd.getBeanClassName(), ClassUtils.getDefaultClassLoader());
-                boolean isAbstractClazz = Modifier.isAbstract(clazz.getModifiers());
-
-                if (SAML2IdPActions.class.isAssignableFrom(clazz) && !isAbstractClazz) {
-                    actionsClasses.add(clazz.getName());
-                } else if (RequestedAuthnContextProvider.class.isAssignableFrom(clazz) && !isAbstractClazz) {
-                    requestedAuthnContextProvidersClasses.add(clazz.getName());
-                }
-            } catch (Throwable t) {
-                LOG.warn("Could not inspect class {}", bd.getBeanClassName(), t);
-            }
-        });
-
-        actionsClasses = Collections.unmodifiableSet(actionsClasses);
-        requestedAuthnContextProvidersClasses = Collections.unmodifiableSet(requestedAuthnContextProvidersClasses);
-    }
-
-    public Set<String> getActionsClasses() {
-        return actionsClasses;
-    }
-
-    public Set<String> getRequestedAuthnContextProvidersClasses() {
-        return requestedAuthnContextProvidersClasses;
-    }
-}
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPLoader.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPLoader.java
index 5e5030e..445873f 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPLoader.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/init/SAML2SPLoader.java
@@ -28,7 +28,9 @@ import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.PropertyUtils;
 import org.apache.syncope.common.lib.types.EntitlementsHolder;
+import org.apache.syncope.common.lib.types.ImplementationTypesHolder;
 import org.apache.syncope.common.lib.types.SAML2SPEntitlement;
+import org.apache.syncope.common.lib.types.SAML2SPImplementationType;
 import org.apache.syncope.core.logic.saml2.SAML2IdPCache;
 import org.apache.syncope.core.logic.saml2.SAML2ReaderWriter;
 import org.apache.syncope.core.persistence.api.SyncopeCoreLoader;
@@ -90,6 +92,7 @@ public class SAML2SPLoader implements SyncopeCoreLoader {
     @Override
     public void load() {
         EntitlementsHolder.getInstance().addAll(SAML2SPEntitlement.values());
+        ImplementationTypesHolder.getInstance().putAll(SAML2SPImplementationType.values());
 
         Properties props = PropertyUtils.read(getClass(), SAML2SP_LOGIC_PROPERTIES, "conf.directory");
         String confDirectory = props.getProperty("conf.directory");
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPEntity.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPEntity.java
index 18bb168..8b66217 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPEntity.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPEntity.java
@@ -158,12 +158,12 @@ public class SAML2IdPEntity {
         return idpTO.getUserTemplate();
     }
 
-    public List<String> getActionsClassNames() {
-        return idpTO.getActionsClassNames();
+    public List<String> getActions() {
+        return idpTO.getActions();
     }
 
-    public String getRequestedAuthnContextProviderClassName() {
-        return idpTO.getRequestedAuthnContextProviderClassName();
+    public String getRequestedAuthnContextProvider() {
+        return idpTO.getRequestedAuthnContextProvider();
     }
 
     public Endpoint getSSOLocation(final SAML2BindingType bindingType) {
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
index 92708ed..bebfc78 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
@@ -38,6 +38,7 @@ import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException;
+import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
 import org.apache.syncope.core.persistence.api.dao.SAML2IdPDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
@@ -55,11 +56,10 @@ import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.provisioning.java.IntAttrNameParser;
 import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
 import org.apache.syncope.core.provisioning.java.utils.TemplateUtils;
-import org.apache.syncope.core.spring.ApplicationContextProvider;
+import org.apache.syncope.core.spring.ImplementationManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -76,6 +76,9 @@ public class SAML2UserManager {
     private UserDAO userDAO;
 
     @Autowired
+    private ImplementationDAO implementationDAO;
+
+    @Autowired
     private IntAttrNameParser intAttrNameParser;
 
     @Autowired
@@ -174,16 +177,11 @@ public class SAML2UserManager {
 
     private List<SAML2IdPActions> getActions(final SAML2IdPEntity idp) {
         List<SAML2IdPActions> actions = new ArrayList<>();
-
-        idp.getActionsClassNames().forEach(className -> {
+        idp.getActions().forEach(impl -> {
             try {
-                Class<?> actionsClass = Class.forName(className);
-                SAML2IdPActions idpActions = (SAML2IdPActions) ApplicationContextProvider.getBeanFactory().
-                        createBean(actionsClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
-
-                actions.add(idpActions);
+                actions.add(ImplementationManager.build(implementationDAO.find(impl)));
             } catch (Exception e) {
-                LOG.warn("Class '{}' not found", className, e);
+                LOG.warn("While building {}", impl, e);
             }
         });
 
diff --git a/ext/saml2sp/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SAML2IdP.java b/ext/saml2sp/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SAML2IdP.java
index 3cf9ddc..5acc217 100644
--- a/ext/saml2sp/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SAML2IdP.java
+++ b/ext/saml2sp/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SAML2IdP.java
@@ -72,9 +72,11 @@ public interface SAML2IdP extends Entity {
 
     List<? extends SAML2IdPItem> getItems();
 
-    List<String> getActionsClassNames();
+    boolean add(Implementation action);
 
-    String getRequestedAuthnContextProviderClassName();
+    List<? extends Implementation> getActions();
 
-    void setRequestedAuthnContextProviderClassName(String requestedAuthnContextProviderClassName);
+    Implementation getRequestedAuthnContextProvider();
+
+    void setRequestedAuthnContextProvider(Implementation requestedAuthnContextProvider);
 }
diff --git a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdP.java b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdP.java
index a2cc963..b393dd9 100644
--- a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdP.java
+++ b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdP.java
@@ -24,19 +24,21 @@ import java.util.Optional;
 import javax.persistence.Basic;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
-import javax.persistence.CollectionTable;
 import javax.persistence.Column;
-import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
 import javax.persistence.Lob;
+import javax.persistence.ManyToMany;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.types.SAML2BindingType;
+import org.apache.syncope.common.lib.types.SAML2SPImplementationType;
+import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdP;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdPItem;
 import org.apache.syncope.core.persistence.api.entity.SAML2UserTemplate;
@@ -86,14 +88,16 @@ public class JPASAML2IdP extends AbstractGeneratedKeyEntity implements SAML2IdP
     @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "idp")
     private JPASAML2UserTemplate userTemplate;
 
-    @ElementCollection(fetch = FetchType.EAGER)
-    @Column(name = "actionClassName")
-    @CollectionTable(name = TABLE + "_actionsClassNames",
+    @ManyToMany(fetch = FetchType.EAGER)
+    @JoinTable(name = "SAML2IdPAction",
             joinColumns =
-            @JoinColumn(name = "saml2IdP_id", referencedColumnName = "id"))
-    private List<String> actionsClassNames = new ArrayList<>();
+            @JoinColumn(name = "saml2idp_id"),
+            inverseJoinColumns =
+            @JoinColumn(name = "implementation_id"))
+    private List<JPAImplementation> actions = new ArrayList<>();
 
-    private String requestedAuthnContextProviderClassName;
+    @OneToOne
+    private JPAImplementation requestedAuthnContextProvider;
 
     @Override
     public String getEntityID() {
@@ -219,17 +223,27 @@ public class JPASAML2IdP extends AbstractGeneratedKeyEntity implements SAML2IdP
     }
 
     @Override
-    public List<String> getActionsClassNames() {
-        return actionsClassNames;
+    public boolean add(final Implementation action) {
+        checkType(action, JPAImplementation.class);
+        checkImplementationType(action, SAML2SPImplementationType.IDP_ACTIONS);
+        return actions.contains((JPAImplementation) action) || actions.add((JPAImplementation) action);
     }
 
     @Override
-    public String getRequestedAuthnContextProviderClassName() {
-        return requestedAuthnContextProviderClassName;
+    public List<? extends Implementation> getActions() {
+        return actions;
     }
 
     @Override
-    public void setRequestedAuthnContextProviderClassName(final String requestedAuthnContextProviderClassName) {
-        this.requestedAuthnContextProviderClassName = requestedAuthnContextProviderClassName;
+    public JPAImplementation getRequestedAuthnContextProvider() {
+        return requestedAuthnContextProvider;
+    }
+
+    @Override
+    public void setRequestedAuthnContextProvider(final Implementation requestedAuthnContextProvider) {
+        checkType(requestedAuthnContextProvider, JPAImplementation.class);
+        checkImplementationType(
+                requestedAuthnContextProvider, SAML2SPImplementationType.REQUESTED_AUTHN_CONTEXT_PROVIDER);
+        this.requestedAuthnContextProvider = (JPAImplementation) requestedAuthnContextProvider;
     }
 }
diff --git a/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java b/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java
index 7f2a482..48bc77d 100644
--- a/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java
+++ b/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java
@@ -32,8 +32,10 @@ import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
 import org.apache.syncope.core.persistence.api.dao.SAML2IdPDAO;
 import org.apache.syncope.core.persistence.api.entity.Entity;
+import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.SAML2EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdP;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdPItem;
@@ -59,6 +61,9 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder {
     private SAML2IdPDAO saml2IdPDAO;
 
     @Autowired
+    private ImplementationDAO implementationDAO;
+
+    @Autowired
     private SAML2EntityFactory entityFactory;
 
     @Autowired
@@ -208,10 +213,28 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder {
         });
         populateItems(idpTO, idp, allowedSchemas);
 
-        idp.getActionsClassNames().clear();
-        idp.getActionsClassNames().addAll(idpTO.getActionsClassNames());
+        idpTO.getActions().forEach(action -> {
+            Implementation implementation = implementationDAO.find(action);
+            if (implementation == null) {
+                LOG.debug("Invalid " + Implementation.class.getSimpleName() + " {}, ignoring...", action);
+            } else {
+                idp.add(implementation);
+            }
+        });
+        // remove all implementations not contained in the TO
+        idp.getActions().removeIf(impl -> !idpTO.getActions().contains(impl.getKey()));
 
-        idp.setRequestedAuthnContextProviderClassName(idpTO.getRequestedAuthnContextProviderClassName());
+        if (idpTO.getRequestedAuthnContextProvider() == null) {
+            idp.setRequestedAuthnContextProvider(null);
+        } else {
+            Implementation implementation = implementationDAO.find(idpTO.getRequestedAuthnContextProvider());
+            if (implementation == null) {
+                LOG.debug("Invalid " + Implementation.class.getSimpleName() + " {}, ignoring...",
+                        idpTO.getRequestedAuthnContextProvider());
+            } else {
+                idp.setRequestedAuthnContextProvider(implementation);
+            }
+        }
 
         return saml2IdPDAO.save(idp);
     }
@@ -258,9 +281,12 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder {
 
         populateItems(idp, idpTO);
 
-        idpTO.getActionsClassNames().addAll(idp.getActionsClassNames());
+        idpTO.getActions().addAll(
+                idp.getActions().stream().map(Entity::getKey).collect(Collectors.toList()));
 
-        idpTO.setRequestedAuthnContextProviderClassName(idp.getRequestedAuthnContextProviderClassName());
+        if (idp.getRequestedAuthnContextProvider() != null) {
+            idpTO.setRequestedAuthnContextProvider(idp.getRequestedAuthnContextProvider().getKey());
+        }
 
         return idpTO;
     }
diff --git a/ext/saml2sp/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SAML2IdPService.java b/ext/saml2sp/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SAML2IdPService.java
index ac117c7..9b31c8a 100644
--- a/ext/saml2sp/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SAML2IdPService.java
+++ b/ext/saml2sp/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SAML2IdPService.java
@@ -28,7 +28,6 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirements;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import java.io.InputStream;
 import java.util.List;
-import java.util.Set;
 import javax.validation.constraints.NotNull;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -54,26 +53,6 @@ import org.apache.syncope.common.rest.api.RESTHeaders;
 public interface SAML2IdPService extends JAXRSService {
 
     /**
-     * Returns the list of available SAML2IdPActions implementations.
-     *
-     * @return the list of available SAML2IdPActions implementations
-     */
-    @GET
-    @Path("actionsClasses")
-    @Produces({ MediaType.APPLICATION_JSON })
-    Set<String> getActionsClasses();
-
-    /**
-     * Returns the list of available RequestedAuthnContextProviders implementations.
-     *
-     * @return the list of available RequestedAuthnContextProviders implementations
-     */
-    @GET
-    @Path("requestedAuthnContextProviders")
-    @Produces({ MediaType.APPLICATION_JSON })
-    Set<String> getRequestedAuthnContextProviderClasses();
-
-    /**
      * Returns a list of all defined SAML 2.0 Identity Providers.
      *
      * @return list of all defined SAML 2.0 Identity Providers
diff --git a/ext/saml2sp/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SAML2IdPServiceImpl.java b/ext/saml2sp/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SAML2IdPServiceImpl.java
index 5952bec..1f2790f 100644
--- a/ext/saml2sp/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SAML2IdPServiceImpl.java
+++ b/ext/saml2sp/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SAML2IdPServiceImpl.java
@@ -20,7 +20,6 @@ package org.apache.syncope.core.rest.cxf.service;
 
 import java.io.InputStream;
 import java.util.List;
-import java.util.Set;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.SAML2IdPTO;
 import org.apache.syncope.common.rest.api.RESTHeaders;
@@ -36,16 +35,6 @@ public class SAML2IdPServiceImpl extends AbstractServiceImpl implements SAML2IdP
     private SAML2IdPLogic logic;
 
     @Override
-    public Set<String> getActionsClasses() {
-        return logic.getActionsClasses();
-    }
-
-    @Override
-    public Set<String> getRequestedAuthnContextProviderClasses() {
-        return logic.getRequestedAuthnContextProviderClasses();
-    }
-
-    @Override
     public List<SAML2IdPTO> list() {
         return logic.list();
     }