You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by mm...@apache.org on 2020/03/07 15:49:49 UTC

[syncope] 05/06: clean up NPEs; add tests for attr rel policy

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

mmoayyed pushed a commit to branch SYNCOPE-163-1
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit 7cf7746bfa40f323023e62143c2677583270b977
Author: Misagh Moayyed <mm...@gmail.com>
AuthorDate: Fri Mar 6 13:58:45 2020 +0330

    clean up NPEs; add tests for attr rel policy
---
 .../lib/attrs/AbstractAttrReleasePolicyConf.java   |   2 +-
 .../lib/attrs/AllowedAttrReleasePolicyConf.java    |   4 +
 .../syncope/common/lib/to/client/ClientAppTO.java  |   5 +-
 .../client/package-info.java}                      |  22 ++--
 .../package-info.java}                             |  22 ++--
 .../core/persistence/api/dao/PolicyDAO.java        |   4 -
 .../dao/authentication/AttrReleasePolicyDAO.java   |  24 ++--
 .../syncope/core/persistence/api/entity/Realm.java |   5 +
 .../api/entity/authentication/ClientApp.java       |   5 +
 .../src/test/resources/domains/MasterContent.xml   |   3 +-
 .../core/persistence/jpa/dao/JPAPolicyDAO.java     | 124 +++++++++------------
 .../authentication/JPAAttrReleasePolicyDAO.java    |  69 ++++++++++++
 .../persistence/jpa/entity/JPAEntityFactory.java   |   4 +
 .../core/persistence/jpa/entity/JPARealm.java      |  16 +++
 .../entity/authentication/AbstractClientApp.java   |  15 +++
 .../jpa/inner/AttrReleasePolicyTest.java           | 103 +++++++++++++++++
 .../jpa/inner/AuthenticationModuleTest.java        |   4 +-
 .../jpa/inner/AuthenticationPolicyTest.java        |   4 +-
 .../jpa/inner/OIDCRelyingPartyTest.java            |   4 +-
 .../jpa/inner/SAML2ServiceProviderTest.java        |   4 +-
 .../src/test/resources/domains/MasterContent.xml   |  10 ++
 ...ITCase.java => SAML2ServiceProviderITCase.java} |   6 +-
 22 files changed, 349 insertions(+), 110 deletions(-)

diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AbstractAttrReleasePolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AbstractAttrReleasePolicyConf.java
index 608943a..0c388df 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AbstractAttrReleasePolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AbstractAttrReleasePolicyConf.java
@@ -24,7 +24,7 @@ import javax.xml.bind.annotation.XmlType;
 import java.io.Serializable;
 
 @XmlType
-@XmlSeeAlso({AllAttrReleasePolicyConf.class, AllowedAttrReleasePolicyConf.class})
+@XmlSeeAlso({AllowedAttrReleasePolicyConf.class})
 public abstract class AbstractAttrReleasePolicyConf implements Serializable, AttrReleasePolicyConf {
 
     private static final long serialVersionUID = 1153200197344709778L;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllowedAttrReleasePolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllowedAttrReleasePolicyConf.java
index 7d241bc..9dd3762 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllowedAttrReleasePolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllowedAttrReleasePolicyConf.java
@@ -29,6 +29,10 @@ import java.util.List;
 public class AllowedAttrReleasePolicyConf extends AbstractAttrReleasePolicyConf implements AttrReleasePolicyConf {
     private static final long serialVersionUID = -1969836661359025380L;
 
+    /**
+     * Specify the list of allowed attribute to release.
+     * Use the special {@code *} to release everything.
+     */
     private List<String> allowedAttributes = new ArrayList<>();
 
     public List<String> getAllowedAttributes() {
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/ClientAppTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/ClientAppTO.java
index 1033781..0dc8052 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/ClientAppTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/ClientAppTO.java
@@ -30,13 +30,16 @@ import org.apache.syncope.common.lib.to.AttrReleasePolicyTO;
 import org.apache.syncope.common.lib.to.AuthenticationPolicyTO;
 import org.apache.syncope.common.lib.to.EntityTO;
 
+import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
 
+@XmlRootElement(name = "clientApp")
 @XmlType
 @XmlSeeAlso({OIDCRelyingPartyTO.class, SAML2ServiceProviderTO.class})
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
-@JsonPropertyOrder(value = {"@class", "key", "name", "description", "authenticationPolicy", "accessPolicy"})
+@JsonPropertyOrder(value = {"@class", "key", "name", "description",
+    "authenticationPolicy", "accessPolicy", "attReleasePolicy"})
 @Schema(subTypes = {OIDCRelyingPartyTO.class, SAML2ServiceProviderTO.class}, discriminatorProperty = "@class")
 public abstract class ClientAppTO extends BaseBean implements EntityTO {
 
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllAttrReleasePolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/package-info.java
similarity index 58%
copy from common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllAttrReleasePolicyConf.java
copy to common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/package-info.java
index 3f097e2..503eff0 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllAttrReleasePolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/client/package-info.java
@@ -6,7 +6,8 @@
  * 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
+ *
+ *   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
@@ -14,15 +15,16 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
  */
-package org.apache.syncope.common.lib.attrs;
+@XmlSchema(namespace = SyncopeConstants.NS)
+@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
+package org.apache.syncope.common.lib.to.client;
+
+import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.jaxb.DateAdapter;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlSchema;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
 
-@XmlRootElement(name = "AllAttrReleasePolicyConf")
-@XmlType
-public class AllAttrReleasePolicyConf extends AbstractAttrReleasePolicyConf implements AttrReleasePolicyConf {
-    private static final long serialVersionUID = -1969836661359025380L;
-}
+import java.util.Date;
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllAttrReleasePolicyConf.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/package-info.java
similarity index 58%
copy from common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllAttrReleasePolicyConf.java
copy to common/am/lib/src/main/java/org/apache/syncope/common/lib/to/package-info.java
index 3f097e2..54e71ba 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllAttrReleasePolicyConf.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/package-info.java
@@ -6,7 +6,8 @@
  * 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
+ *
+ *   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
@@ -14,15 +15,16 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
  */
-package org.apache.syncope.common.lib.attrs;
+@XmlSchema(namespace = SyncopeConstants.NS)
+@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = Date.class, value = DateAdapter.class), })
+package org.apache.syncope.common.lib.to;
+
+import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.jaxb.DateAdapter;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlSchema;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
 
-@XmlRootElement(name = "AllAttrReleasePolicyConf")
-@XmlType
-public class AllAttrReleasePolicyConf extends AbstractAttrReleasePolicyConf implements AttrReleasePolicyConf {
-    private static final long serialVersionUID = -1969836661359025380L;
-}
+import java.util.Date;
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PolicyDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PolicyDAO.java
index 4d0cb1e..7dc74c2 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PolicyDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PolicyDAO.java
@@ -52,10 +52,6 @@ public interface PolicyDAO extends DAO<Policy> {
 
     List<AccountPolicy> findByResource(ExternalResource resource);
 
-    List<AuthenticationPolicy> findByAuthenticationRule(Implementation authenticationRule);
-
-    List<AccessPolicy> findByAccessRule(Implementation accessRule);
-
     List<Policy> findAll();
 
     <T extends Policy> T save(T policy);
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllAttrReleasePolicyConf.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/authentication/AttrReleasePolicyDAO.java
similarity index 60%
rename from common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllAttrReleasePolicyConf.java
rename to core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/authentication/AttrReleasePolicyDAO.java
index 3f097e2..b2c1d19 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attrs/AllAttrReleasePolicyConf.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/authentication/AttrReleasePolicyDAO.java
@@ -16,13 +16,23 @@
  * under the License.
  *
  */
-package org.apache.syncope.common.lib.attrs;
+package org.apache.syncope.core.persistence.api.dao.authentication;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
+import org.apache.syncope.core.persistence.api.dao.DAO;
+import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
+
+import java.util.List;
+
+public interface AttrReleasePolicyDAO extends DAO<AttrReleasePolicy> {
+
+    AttrReleasePolicy find(String key);
+
+    List<AttrReleasePolicy> findAll();
+
+    AttrReleasePolicy save(AttrReleasePolicy authenticationModule);
+
+    void delete(String key);
+
+    void delete(AttrReleasePolicy authenticationModule);
 
-@XmlRootElement(name = "AllAttrReleasePolicyConf")
-@XmlType
-public class AllAttrReleasePolicyConf extends AbstractAttrReleasePolicyConf implements AttrReleasePolicyConf {
-    private static final long serialVersionUID = -1969836661359025380L;
 }
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Realm.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Realm.java
index 6c7a542..bcdbd9d 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Realm.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Realm.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.api.entity;
 
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
+import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import java.util.List;
@@ -54,6 +55,10 @@ public interface Realm extends Entity {
 
     AccessPolicy getAccessPolicy();
 
+    void setAttrReleasePolicy(AttrReleasePolicy policy);
+
+    AttrReleasePolicy getAttrReleasePolicy();
+
     boolean add(Implementation action);
 
     List<? extends Implementation> getActions();
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/authentication/ClientApp.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/authentication/ClientApp.java
index 1c3cce9..4a6cee1 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/authentication/ClientApp.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/authentication/ClientApp.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.api.entity.authentication;
 
 import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.policy.AccessPolicy;
+import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.AuthenticationPolicy;
 
 public interface ClientApp extends Entity {
@@ -39,4 +40,8 @@ public interface ClientApp extends Entity {
     AccessPolicy getAccessPolicy();
 
     void setAccessPolicy(AccessPolicy policy);
+
+    AttrReleasePolicy getAttrReleasePolicy();
+
+    void setAttrReleasePolicy(AttrReleasePolicy policy);
 }
diff --git a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
index d25dc95..e9037de 100644
--- a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
@@ -59,6 +59,7 @@ under the License.
   <AccessPolicy id="419935c7-deb3-40b3-8a9a-683037e523a2" name="MyDefaultAccessPolicyConf"
                 description="an access policy" />
 
+  
   <RelationshipType id="inclusion" description="Models the act that an object is included in another"/>
   <RelationshipType id="neighborhood" description="Models the act that an object is near another"/>
   
@@ -2398,4 +2399,4 @@ $$ }&#10;
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[AnyObjectLogic]:[]:[unassign]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[AnyObjectLogic]:[]:[unlink]:[SUCCESS]" logLevel="DEBUG"/>
   <SyncopeLogger logType="AUDIT" logName="syncope.audit.[LOGIC]:[AnyObjectLogic]:[]:[update]:[SUCCESS]" logLevel="DEBUG"/>
-</dataset>
\ No newline at end of file
+</dataset>
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java
index f552f2a..fbaad71 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
-import java.util.List;
-import javax.persistence.TypedQuery;
-import org.apache.syncope.common.lib.access.to.AccessPolicyTO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
@@ -29,18 +26,18 @@ import org.apache.syncope.core.persistence.api.entity.policy.AccessPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.AuthenticationPolicy;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.Policy;
 import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PushPolicy;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.jpa.entity.policy.AbstractPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccessPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccountPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAttrReleasePolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAuthenticationPolicy;
-import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullCorrelationRuleEntity;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPasswordPolicy;
+import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullCorrelationRuleEntity;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPushCorrelationRuleEntity;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPushPolicy;
@@ -48,6 +45,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Repository;
 
+import javax.persistence.TypedQuery;
+
+import java.util.List;
+
 @Repository
 public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
 
@@ -61,20 +62,20 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
 
     private static <T extends Policy> Class<? extends AbstractPolicy> getEntityReference(final Class<T> reference) {
         return AccountPolicy.class.isAssignableFrom(reference)
-                ? JPAAccountPolicy.class
-                : PasswordPolicy.class.isAssignableFrom(reference)
-                ? JPAPasswordPolicy.class
-                : PullPolicy.class.isAssignableFrom(reference)
-                ? JPAPullPolicy.class
-                : PushPolicy.class.isAssignableFrom(reference)
-                ? JPAPushPolicy.class
-                : AuthenticationPolicy.class.isAssignableFrom(reference)
-                ? JPAAuthenticationPolicy.class
-                : AccessPolicy.class.isAssignableFrom(reference)
-                ? JPAAttrReleasePolicy.class
-                : AttrReleasePolicy.class.isAssignableFrom(reference)
-                ? JPAAccessPolicy.class
-                : null;
+            ? JPAAccountPolicy.class
+            : PasswordPolicy.class.isAssignableFrom(reference)
+            ? JPAPasswordPolicy.class
+            : PullPolicy.class.isAssignableFrom(reference)
+            ? JPAPullPolicy.class
+            : PushPolicy.class.isAssignableFrom(reference)
+            ? JPAPushPolicy.class
+            : AuthenticationPolicy.class.isAssignableFrom(reference)
+            ? JPAAuthenticationPolicy.class
+            : AccessPolicy.class.isAssignableFrom(reference)
+            ? JPAAttrReleasePolicy.class
+            : AttrReleasePolicy.class.isAssignableFrom(reference)
+            ? JPAAccessPolicy.class
+            : null;
     }
 
     @SuppressWarnings("unchecked")
@@ -86,7 +87,7 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
     @Override
     public <T extends Policy> List<T> find(final Class<T> reference) {
         TypedQuery<T> query = entityManager().createQuery(
-                "SELECT e FROM " + getEntityReference(reference).getSimpleName() + " e", reference);
+            "SELECT e FROM " + getEntityReference(reference).getSimpleName() + " e", reference);
 
         return query.getResultList();
     }
@@ -94,7 +95,7 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
     @Override
     public List<AccountPolicy> findByAccountRule(final Implementation accountRule) {
         TypedQuery<AccountPolicy> query = entityManager().createQuery(
-                "SELECT e FROM " + JPAAccountPolicy.class.getSimpleName() + " e "
+            "SELECT e FROM " + JPAAccountPolicy.class.getSimpleName() + " e "
                 + "WHERE :accountRule MEMBER OF e.rules", AccountPolicy.class);
         query.setParameter("accountRule", accountRule);
 
@@ -104,7 +105,7 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
     @Override
     public List<PasswordPolicy> findByPasswordRule(final Implementation passwordRule) {
         TypedQuery<PasswordPolicy> query = entityManager().createQuery(
-                "SELECT e FROM " + JPAPasswordPolicy.class.getSimpleName() + " e "
+            "SELECT e FROM " + JPAPasswordPolicy.class.getSimpleName() + " e "
                 + "WHERE :passwordRule MEMBER OF e.rules", PasswordPolicy.class);
         query.setParameter("passwordRule", passwordRule);
 
@@ -112,9 +113,19 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
     }
 
     @Override
+    public List<PullPolicy> findByPullCorrelationRule(final Implementation correlationRule) {
+        TypedQuery<PullPolicy> query = entityManager().createQuery(
+            "SELECT DISTINCT e.pullPolicy FROM " + JPAPullCorrelationRuleEntity.class.getSimpleName() + " e "
+                + "WHERE e.implementation=:correlationRule", PullPolicy.class);
+        query.setParameter("correlationRule", correlationRule);
+
+        return query.getResultList();
+    }
+
+    @Override
     public List<AuthenticationPolicy> findByAuthenticationPolicy(final Implementation policy) {
         TypedQuery<AuthenticationPolicy> query = entityManager().createQuery(
-                "SELECT e FROM " + JPAAuthenticationPolicy.class.getSimpleName() + " e "
+            "SELECT e FROM " + JPAAuthenticationPolicy.class.getSimpleName() + " e "
                 + "WHERE :authenticationPolicy MEMBER OF e.rules", AuthenticationPolicy.class);
         query.setParameter("authenticationPolicy", policy);
         return query.getResultList();
@@ -123,7 +134,7 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
     @Override
     public List<AccessPolicy> findByAccessPolicy(final Implementation policy) {
         TypedQuery<AccessPolicy> query = entityManager().createQuery(
-                "SELECT e FROM " + JPAAuthenticationPolicy.class.getSimpleName() + " e "
+            "SELECT e FROM " + JPAAuthenticationPolicy.class.getSimpleName() + " e "
                 + "WHERE :accessPolicy MEMBER OF e.rules", AccessPolicy.class);
         query.setParameter("accessPolicy", policy);
         return query.getResultList();
@@ -139,19 +150,9 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
     }
 
     @Override
-    public List<PullPolicy> findByPullCorrelationRule(final Implementation correlationRule) {
-        TypedQuery<PullPolicy> query = entityManager().createQuery(
-                "SELECT DISTINCT e.pullPolicy FROM " + JPAPullCorrelationRuleEntity.class.getSimpleName() + " e "
-                + "WHERE e.implementation=:correlationRule", PullPolicy.class);
-        query.setParameter("correlationRule", correlationRule);
-
-        return query.getResultList();
-    }
-
-    @Override
     public List<PushPolicy> findByPushCorrelationRule(final Implementation correlationRule) {
         TypedQuery<PushPolicy> query = entityManager().createQuery(
-                "SELECT DISTINCT e.pushPolicy FROM " + JPAPushCorrelationRuleEntity.class.getSimpleName() + " e "
+            "SELECT DISTINCT e.pushPolicy FROM " + JPAPushCorrelationRuleEntity.class.getSimpleName() + " e "
                 + "WHERE e.implementation=:correlationRule", PushPolicy.class);
         query.setParameter("correlationRule", correlationRule);
 
@@ -161,7 +162,7 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
     @Override
     public List<AccountPolicy> findByResource(final ExternalResource resource) {
         TypedQuery<AccountPolicy> query = entityManager().createQuery(
-                "SELECT e FROM " + JPAAccountPolicy.class.getSimpleName() + " e "
+            "SELECT e FROM " + JPAAccountPolicy.class.getSimpleName() + " e "
                 + "WHERE :resource MEMBER OF e.resources", AccountPolicy.class);
         query.setParameter("resource", resource);
 
@@ -171,27 +172,7 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
     @Override
     public List<Policy> findAll() {
         TypedQuery<Policy> query = entityManager().createQuery(
-                "SELECT e FROM " + AbstractPolicy.class.getSimpleName() + " e", Policy.class);
-        return query.getResultList();
-    }
-
-    @Override
-    public List<AuthenticationPolicy> findByAuthenticationRule(final Implementation authenticationRule) {
-        TypedQuery<AuthenticationPolicy> query = entityManager().createQuery(
-                "SELECT e FROM " + JPAAuthenticationPolicy.class.getSimpleName() + " e "
-                + "WHERE :authenticationRule MEMBER OF e.rules", AuthenticationPolicy.class);
-        query.setParameter("authenticationRule", authenticationRule);
-
-        return query.getResultList();
-    }
-
-    @Override
-    public List<AccessPolicy> findByAccessRule(final Implementation accessRule) {
-        TypedQuery<AccessPolicy> query = entityManager().createQuery(
-                "SELECT e FROM " + JPAAccessPolicy.class.getSimpleName() + " e "
-                + "WHERE :accessRule MEMBER OF e.rules", AccessPolicy.class);
-        query.setParameter("accessRule", accessRule);
-
+            "SELECT e FROM " + AbstractPolicy.class.getSimpleName() + " e", Policy.class);
         return query.getResultList();
     }
 
@@ -202,19 +183,24 @@ public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
 
     @Override
     public <T extends Policy> void delete(final T policy) {
-        if (!(policy instanceof AccessPolicyTO)) {
-            realmDAO.findByPolicy(policy).forEach(realm -> {
-                if (policy instanceof AccountPolicy) {
-                    realm.setAccountPolicy(null);
-                } else if (policy instanceof PasswordPolicy) {
-                    realm.setPasswordPolicy(null);
-                } else if (policy instanceof AuthenticationPolicy) {
-                    realm.setAuthenticationPolicy(null);
-                }
-            });
-        }
 
-        if (!(policy instanceof AuthenticationPolicy) && !(policy instanceof AccessPolicyTO)) {
+        realmDAO.findByPolicy(policy).forEach(realm -> {
+            if (policy instanceof AccountPolicy) {
+                realm.setAccountPolicy(null);
+            } else if (policy instanceof PasswordPolicy) {
+                realm.setPasswordPolicy(null);
+            } else if (policy instanceof AuthenticationPolicy) {
+                realm.setAuthenticationPolicy(null);
+            } else if (policy instanceof AccessPolicy) {
+                realm.setAccessPolicy(null);
+            } else if (policy instanceof AttrReleasePolicy) {
+                realm.setAttrReleasePolicy(null);
+            }
+        });
+        
+        if (!(policy instanceof AuthenticationPolicy)
+            && !(policy instanceof AttrReleasePolicy)
+            && !(policy instanceof AccessPolicy)) {
             resourceDAO.findByPolicy(policy).forEach(resource -> {
                 if (policy instanceof AccountPolicy) {
                     resource.setAccountPolicy(null);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/authentication/JPAAttrReleasePolicyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/authentication/JPAAttrReleasePolicyDAO.java
new file mode 100644
index 0000000..c210fda
--- /dev/null
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/authentication/JPAAttrReleasePolicyDAO.java
@@ -0,0 +1,69 @@
+/*
+ * 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.persistence.jpa.dao.authentication;
+
+import org.apache.syncope.core.persistence.api.dao.authentication.AttrReleasePolicyDAO;
+import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
+import org.apache.syncope.core.persistence.jpa.dao.AbstractDAO;
+import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAttrReleasePolicy;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.TypedQuery;
+
+import java.util.List;
+
+@Repository
+public class JPAAttrReleasePolicyDAO extends AbstractDAO<AttrReleasePolicy> implements AttrReleasePolicyDAO {
+
+    @Override
+    public AttrReleasePolicy find(final String key) {
+        return entityManager().find(JPAAttrReleasePolicy.class, key);
+    }
+
+    @Transactional(readOnly = true)
+    @Override
+    public List<AttrReleasePolicy> findAll() {
+        TypedQuery<AttrReleasePolicy> query = entityManager().createQuery(
+            "SELECT e FROM " + JPAAttrReleasePolicy.class.getSimpleName() + " e", AttrReleasePolicy.class);
+
+        return query.getResultList();
+    }
+
+    @Override
+    public AttrReleasePolicy save(final AttrReleasePolicy policy) {
+        return entityManager().merge(policy);
+    }
+
+    @Override
+    public void delete(final String key) {
+        AttrReleasePolicy policy = find(key);
+        if (policy == null) {
+            return;
+        }
+
+        delete(policy);
+    }
+
+    @Override
+    public void delete(final AttrReleasePolicy policy) {
+        entityManager().remove(policy);
+    }
+
+}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
index e7953e6..2dc357a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
@@ -66,6 +66,7 @@ import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
 import org.apache.syncope.core.persistence.api.entity.policy.AccessPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
+import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.AuthenticationPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PullCorrelationRuleEntity;
@@ -117,6 +118,7 @@ import org.apache.syncope.core.persistence.jpa.entity.group.JPAGroup;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPATypeExtension;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccessPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccountPolicy;
+import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAttrReleasePolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAuthenticationPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPasswordPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullCorrelationRuleEntity;
@@ -309,6 +311,8 @@ public class JPAEntityFactory implements EntityFactory {
             result = (E) new JPAAuthenticationPolicy();
         }  else if (reference.equals(AccessPolicy.class)) {
             result = (E) new JPAAccessPolicy();
+        }  else if (reference.equals(AttrReleasePolicy.class)) {
+            result = (E) new JPAAttrReleasePolicy();
         } else if (reference.equals(OIDCRelyingParty.class)) {
             result = (E) new JPAOIDCRelyingParty();
         } else if (reference.equals(SAML2ServiceProvider.class)) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
index 79a6dfa..91633d4 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
@@ -26,9 +26,11 @@ import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
+import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccountPolicy;
+import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAttrReleasePolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPasswordPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResource;
 import org.apache.syncope.core.persistence.jpa.validation.entity.RealmCheck;
@@ -84,6 +86,9 @@ public class JPARealm extends AbstractGeneratedKeyEntity implements Realm {
     @ManyToOne(fetch = FetchType.EAGER)
     private JPAAccessPolicy accessPolicy;
 
+    @ManyToOne(fetch = FetchType.EAGER)
+    private JPAAttrReleasePolicy attrReleasePolicy;
+
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(name = TABLE + "Action",
             joinColumns =
@@ -209,6 +214,17 @@ public class JPARealm extends AbstractGeneratedKeyEntity implements Realm {
     }
 
     @Override
+    public void setAttrReleasePolicy(final AttrReleasePolicy policy) {
+        checkType(policy, JPAAttrReleasePolicy.class);
+        this.attrReleasePolicy = (JPAAttrReleasePolicy) policy;
+    }
+
+    @Override
+    public AttrReleasePolicy getAttrReleasePolicy() {
+        return this.attrReleasePolicy;
+    }
+
+    @Override
     public boolean add(final ExternalResource resource) {
         checkType(resource, JPAExternalResource.class);
         return resources.contains((JPAExternalResource) resource) || resources.add((JPAExternalResource) resource);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/authentication/AbstractClientApp.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/authentication/AbstractClientApp.java
index 4ad3910..d2926e8 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/authentication/AbstractClientApp.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/authentication/AbstractClientApp.java
@@ -19,9 +19,11 @@
 package org.apache.syncope.core.persistence.jpa.entity.authentication;
 
 import org.apache.syncope.core.persistence.api.entity.authentication.ClientApp;
+import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.AuthenticationPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.AccessPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.AbstractGeneratedKeyEntity;
+import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAttrReleasePolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAuthenticationPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccessPolicy;
 
@@ -47,6 +49,9 @@ public class AbstractClientApp extends AbstractGeneratedKeyEntity implements Cli
     @ManyToOne(fetch = FetchType.EAGER)
     private JPAAccessPolicy accessPolicy;
 
+    @ManyToOne(fetch = FetchType.EAGER)
+    private JPAAttrReleasePolicy attrReleasePolicy;
+
     @Override
     public String getName() {
         return name;
@@ -87,4 +92,14 @@ public class AbstractClientApp extends AbstractGeneratedKeyEntity implements Cli
         this.accessPolicy = (JPAAccessPolicy) accessPolicy;
     }
 
+    @Override
+    public AttrReleasePolicy getAttrReleasePolicy() {
+        return this.attrReleasePolicy;
+    }
+
+    @Override
+    public void setAttrReleasePolicy(final AttrReleasePolicy policy) {
+        checkType(policy, JPAAccessPolicy.class);
+        this.attrReleasePolicy = (JPAAttrReleasePolicy) policy;
+    }
 }
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AttrReleasePolicyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AttrReleasePolicyTest.java
new file mode 100644
index 0000000..f801229
--- /dev/null
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AttrReleasePolicyTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.persistence.jpa.inner;
+
+import org.apache.syncope.common.lib.attrs.AllowedAttrReleasePolicyConf;
+import org.apache.syncope.common.lib.types.AMImplementationType;
+import org.apache.syncope.common.lib.types.ImplementationEngine;
+import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
+import org.apache.syncope.core.persistence.api.dao.authentication.AttrReleasePolicyDAO;
+import org.apache.syncope.core.persistence.api.entity.Implementation;
+import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
+import org.apache.syncope.core.persistence.jpa.AbstractTest;
+import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.UUID;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+@Transactional("Master")
+public class AttrReleasePolicyTest extends AbstractTest {
+
+    @Autowired
+    private AttrReleasePolicyDAO attrReleasePolicyDAO;
+
+    @Autowired
+    private ImplementationDAO implementationDAO;
+
+    @Test
+    public void find() {
+        AttrReleasePolicy policy = attrReleasePolicyDAO.find("019935c7-deb3-40b3-8a9a-683037e523a2");
+        assertNull(policy);
+        policy = attrReleasePolicyDAO.find("319935c7-deb3-40b3-8a9a-683037e523a2");
+        assertNotNull(policy);
+        policy = attrReleasePolicyDAO.find(UUID.randomUUID().toString());
+        assertNull(policy);
+    }
+
+    @Test
+    public void findAll() {
+        List<AttrReleasePolicy> policies = attrReleasePolicyDAO.findAll();
+        assertNotNull(policies);
+        assertEquals(2, policies.size());
+    }
+
+    @Test
+    public void save() {
+        int beforeCount = attrReleasePolicyDAO.findAll().size();
+        AttrReleasePolicy policy = entityFactory.newEntity(AttrReleasePolicy.class);
+        policy.setName("AttrReleasePolicyAllowEverything");
+        policy.setDescription("This is a sample attr release policy that releases everything");
+
+        AllowedAttrReleasePolicyConf conf = new AllowedAttrReleasePolicyConf();
+        conf.setAllowedAttributes(List.of("*"));
+        conf.setName("AttrReleasePolicyAllowEverything");
+
+        Implementation type = entityFactory.newEntity(Implementation.class);
+        type.setKey("AttrReleasePolicyAllowEverything");
+        type.setEngine(ImplementationEngine.JAVA);
+        type.setType(AMImplementationType.ATTR_RELEASE_POLICY_CONFIGURATIONS);
+        type.setBody(POJOHelper.serialize(conf));
+        type = implementationDAO.save(type);
+
+        policy.addConfiguration(type);
+        attrReleasePolicyDAO.save(policy);
+
+        assertNotNull(policy);
+        assertNotNull(policy.getKey());
+
+        int afterCount = attrReleasePolicyDAO.findAll().size();
+        assertEquals(afterCount, beforeCount + 1);
+    }
+
+    @Test
+    public void delete() {
+        AttrReleasePolicy policy = attrReleasePolicyDAO.find("319935c7-deb3-40b3-8a9a-683037e523a2");
+        assertNotNull(policy);
+        attrReleasePolicyDAO.delete("319935c7-deb3-40b3-8a9a-683037e523a2");
+        policy = attrReleasePolicyDAO.find("319935c7-deb3-40b3-8a9a-683037e523a2");
+        assertNull(policy);
+    }
+}
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthenticationModuleTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthenticationModuleTest.java
index 37db549..26e7bc4 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthenticationModuleTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthenticationModuleTest.java
@@ -39,7 +39,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 @Transactional("Master")
 public class AuthenticationModuleTest extends AbstractTest {
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthenticationPolicyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthenticationPolicyTest.java
index 9303c14..d5f2942 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthenticationPolicyTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthenticationPolicyTest.java
@@ -34,7 +34,9 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.List;
 import java.util.UUID;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 @Transactional("Master")
 public class AuthenticationPolicyTest extends AbstractTest {
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/OIDCRelyingPartyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/OIDCRelyingPartyTest.java
index c2fd74f..a9b33f9 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/OIDCRelyingPartyTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/OIDCRelyingPartyTest.java
@@ -27,7 +27,9 @@ import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 @Transactional("Master")
 public class OIDCRelyingPartyTest extends AbstractClientAppTest {
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/SAML2ServiceProviderTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/SAML2ServiceProviderTest.java
index 19898d0..c3a287d 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/SAML2ServiceProviderTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/SAML2ServiceProviderTest.java
@@ -27,7 +27,9 @@ import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 @Transactional("Master")
 public class SAML2ServiceProviderTest extends AbstractClientAppTest {
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 1556977..7375f12 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -59,6 +59,16 @@ under the License.
   <AccessPolicy id="419935c7-deb3-40b3-8a9a-683037e523a2" name="MyDefaultAccessPolicyConf"
                 description="an access policy" />
 
+  <!-- Attr Release Policies -->
+  <Implementation id="AllowedAttrReleasePolicyConf" type="ATTR_RELEASE_CONFIGURATIONS" engine="JAVA"
+                  body='{"@class":"org.apache.syncope.common.lib.attrs.AllowedAttrReleasePolicyConf","name":"AllowedAttrReleasePolicy","allowedAttributes":["cn","givenName","uid"]}'/>
+  <AttrReleasePolicy id="319935c7-deb3-40b3-8a9a-683037e523a2" name="AllowedAttrReleasePolicy"
+                description="allowed attribute release policy policy" />
+
+  <Implementation id="DenyAttrReleasePolicyConf" type="ATTR_RELEASE_CONFIGURATIONS" engine="JAVA"
+                  body='{"@class":"org.apache.syncope.common.lib.attrs.AllowedAttrReleasePolicyConf","name":"DenyAttrReleasePolicyConf"}'/>
+  <AttrReleasePolicy id="219935c7-deb3-40b3-8a9a-683037e523a2" name="DenyAttrReleasePolicy" description="deny attribute release policy policy" />
+
   <RelationshipType id="inclusion" description="Models the act that an object is included in another"/>
   <RelationshipType id="neighborhood" description="Models the act that an object is near another"/>
   
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SAML2SPITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SAML2ServiceProviderITCase.java
similarity index 92%
rename from fit/core-reference/src/test/java/org/apache/syncope/fit/core/SAML2SPITCase.java
rename to fit/core-reference/src/test/java/org/apache/syncope/fit/core/SAML2ServiceProviderITCase.java
index 95dac54..8f217979 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SAML2SPITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SAML2ServiceProviderITCase.java
@@ -20,14 +20,14 @@ package org.apache.syncope.fit.core;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.apache.syncope.common.lib.access.to.AccessPolicyTO;
-import org.apache.syncope.common.lib.authentication.policy.to.AuthenticationPolicyTO;
+import org.apache.syncope.common.lib.to.AccessPolicyTO;
+import org.apache.syncope.common.lib.to.AuthenticationPolicyTO;
 import org.apache.syncope.common.lib.to.client.SAML2ServiceProviderTO;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.fit.AbstractITCase;
 import org.junit.jupiter.api.Test;
 
-public class SAML2SPITCase extends AbstractITCase {
+public class SAML2ServiceProviderITCase extends AbstractITCase {
 
     @Test
     public void create() {