From 0ea7e21d26833e337f6c0bf0a2e7e52b5e34924e Mon Sep 17 00:00:00 2001 From: TCHERNIATINSKY <philippe.tcherniatinsky@inrae.fr> Date: Fri, 13 May 2022 14:56:07 +0200 Subject: [PATCH] =?UTF-8?q?Correction=20de=20la=20cr=C3=A9ation=20des=20au?= =?UTF-8?q?thorizations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ajout d'un rôle writer pour l'application - utilisation de ce rôle pour la création des authorizations --- .../fr/inra/oresing/persistence/SqlPolicy.java | 2 ++ .../inra/oresing/persistence/SqlService.java | 16 +++++++++++++--- .../oresing/rest/AuthorizationService.java | 3 ++- .../fr/inra/oresing/rest/OreSiService.java | 18 +++++++++++++++++- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/inra/oresing/persistence/SqlPolicy.java b/src/main/java/fr/inra/oresing/persistence/SqlPolicy.java index 4d31ceef8..fb208dffd 100644 --- a/src/main/java/fr/inra/oresing/persistence/SqlPolicy.java +++ b/src/main/java/fr/inra/oresing/persistence/SqlPolicy.java @@ -18,6 +18,8 @@ public class SqlPolicy implements WithSqlIdentifier { String usingExpression; + String withCheckExpression; + @Override public String getSqlIdentifier() { return WithSqlIdentifier.escapeSqlIdentifier(id); diff --git a/src/main/java/fr/inra/oresing/persistence/SqlService.java b/src/main/java/fr/inra/oresing/persistence/SqlService.java index 6bddf6220..9051501b0 100644 --- a/src/main/java/fr/inra/oresing/persistence/SqlService.java +++ b/src/main/java/fr/inra/oresing/persistence/SqlService.java @@ -2,6 +2,7 @@ package fr.inra.oresing.persistence; import fr.inra.oresing.persistence.roles.*; import lombok.extern.slf4j.Slf4j; +import org.assertj.core.util.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.namedparam.EmptySqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; @@ -63,21 +64,30 @@ public class SqlService { } public void createPolicy(SqlPolicy sqlPolicy) { + dropPolicy(sqlPolicy); + String using = "", withCheck = ""; + if(!Strings.isNullOrEmpty(sqlPolicy.getUsingExpression())){ + using = String.format(" USING (%s)", sqlPolicy.getUsingExpression()); + } + if(!Strings.isNullOrEmpty(sqlPolicy.getWithCheckExpression())){ + using = String.format(" WITH CHECK (%s)", sqlPolicy.getWithCheckExpression()); + } String createPolicySql = String.format( - "CREATE POLICY %s ON %s AS %s FOR %s TO %s USING (%s)", + "CREATE POLICY %s ON %s AS %s FOR %s TO %s %s %s", sqlPolicy.getSqlIdentifier(), sqlPolicy.getTable().getSqlIdentifier(), sqlPolicy.getPermissiveOrRestrictive().name(), sqlPolicy.getStatement().name(), sqlPolicy.getRole().getSqlIdentifier(), - sqlPolicy.getUsingExpression() + using, + withCheck ); execute(createPolicySql); } public void dropPolicy(SqlPolicy sqlPolicy) { String createPolicySql = String.format( - "DROP POLICY %s ON %s", + "DROP POLICY IF EXISTS %s ON %s", sqlPolicy.getSqlIdentifier(), sqlPolicy.getTable().getSqlIdentifier() ); diff --git a/src/main/java/fr/inra/oresing/rest/AuthorizationService.java b/src/main/java/fr/inra/oresing/rest/AuthorizationService.java index 9e3ebe6e2..67fac7931 100644 --- a/src/main/java/fr/inra/oresing/rest/AuthorizationService.java +++ b/src/main/java/fr/inra/oresing/rest/AuthorizationService.java @@ -139,7 +139,8 @@ public class AuthorizationService { SqlPolicy.PermissiveOrRestrictive.PERMISSIVE, statement, oreSiRightOnApplicationRole, - usingExpression + usingExpression, + null ); return sqlPolicy; } diff --git a/src/main/java/fr/inra/oresing/rest/OreSiService.java b/src/main/java/fr/inra/oresing/rest/OreSiService.java index 3f6272b86..3776b3166 100644 --- a/src/main/java/fr/inra/oresing/rest/OreSiService.java +++ b/src/main/java/fr/inra/oresing/rest/OreSiService.java @@ -144,9 +144,12 @@ public class OreSiService { OreSiRightOnApplicationRole adminOnApplicationRole = OreSiRightOnApplicationRole.adminOn(app); OreSiRightOnApplicationRole readerOnApplicationRole = OreSiRightOnApplicationRole.readerOn(app); + OreSiRightOnApplicationRole writerOnApplicationRole = OreSiRightOnApplicationRole.writerOn(app); db.createRole(adminOnApplicationRole); db.createRole(readerOnApplicationRole); + db.createRole(writerOnApplicationRole); + db.addUserInRole(writerOnApplicationRole, readerOnApplicationRole); db.createPolicy(new SqlPolicy( String.join("_", adminOnApplicationRole.getAsSqlRole(), SqlPolicy.Statement.ALL.name()), @@ -154,7 +157,8 @@ public class OreSiService { SqlPolicy.PermissiveOrRestrictive.PERMISSIVE, SqlPolicy.Statement.ALL, adminOnApplicationRole, - "name = '" + app.getName() + "'" + "name = '" + app.getName() + "'", + null )); db.createPolicy(new SqlPolicy( @@ -163,6 +167,18 @@ public class OreSiService { SqlPolicy.PermissiveOrRestrictive.PERMISSIVE, SqlPolicy.Statement.SELECT, readerOnApplicationRole, + "name = '" + app.getName() + "'", + null + )); + + + db.createPolicy(new SqlPolicy( + String.join("_", writerOnApplicationRole.getAsSqlRole(), SqlPolicy.Statement.INSERT.name()), + SqlSchema.main().application(), + SqlPolicy.PermissiveOrRestrictive.PERMISSIVE, + SqlPolicy.Statement.INSERT, + writerOnApplicationRole, + null, "name = '" + app.getName() + "'" )); -- GitLab