{"id":92114,"date":"2020-08-23T19:41:56","date_gmt":"2020-08-23T17:41:56","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql"},"modified":"2020-08-23T19:41:56","modified_gmt":"2020-08-23T17:41:56","slug":"realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql","title":{"rendered":"Mise en \u0153uvre du mod\u00e8le de contr\u00f4le d'acc\u00e8s bas\u00e9 sur les lignes avec Row Level Security dans PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>D\u00e9veloppement du sujet <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515896\/\">\u00c9tude sur la mise en \u0153uvre de la s\u00e9curit\u00e9 au niveau des lignes dans PostgreSQL<\/a><\/noindex> et <b>pour une r\u00e9ponse d\u00e9velopp\u00e9e<\/b> sur <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515628\/#comment_21973176\">commentaire.<\/a><\/noindex><\/p>\n<p>La strat\u00e9gie utilis\u00e9e implique le concept de \u00ab Logique m\u00e9tier dans la BDD \u00bb, qui a \u00e9t\u00e9 d\u00e9crit plus en d\u00e9tail ici \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515628\/\">\u00c9tude sur la mise en \u0153uvre de la logique m\u00e9tier au niveau des fonctions stock\u00e9es PostgreSQL<\/a><\/noindex><\/p>\n<p>La partie th\u00e9orique est bien d\u00e9crite dans la documentation <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/\">Postgres Pro<\/a><\/noindex> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/11\/ddl-rowsecurity\">Politiques de protection des lignes<\/a><\/noindex>. Ci-dessous, nous examinons la mise en \u0153uvre pratique <b>d'un probl\u00e8me commercial sp\u00e9cifique \u2014 un mod\u00e8le d'acc\u00e8s bas\u00e9 sur les r\u00f4les.<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Mise en \u0153uvre du mod\u00e8le de contr\u00f4le d&#039;acc\u00e8s bas\u00e9 sur les lignes avec Row Level Security dans PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/08\/df69397b8638421732a67e457c99857c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p>L'article n'apporte rien de nouveau, il n'y a pas de sens cach\u00e9 ni de connaissances secr\u00e8tes. Juste un aper\u00e7u de la mise en \u0153uvre pratique d'une id\u00e9e th\u00e9orique. Si cela vous int\u00e9resse, lisez. Si cela ne vous int\u00e9resse pas, ne perdez pas votre temps.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>D\u00e9finition du probl\u00e8me<\/h2>\n<p>\nIl est n\u00e9cessaire de limiter l'acc\u00e8s \u00e0 la consultation\/insertion\/modification\/suppression d'un document en fonction du r\u00f4le de l'utilisateur de l'application. Par r\u00f4le, nous entendons une entr\u00e9e dans la table <b>roles<\/b> qui est li\u00e9e par une relation plusieurs-\u00e0-plusieurs avec la table <b>users<\/b>. Les d\u00e9tails de la mise en \u0153uvre des tables, en raison de leur trivialit\u00e9, sont omis. De m\u00eame, les d\u00e9tails sp\u00e9cifiques de mise en \u0153uvre li\u00e9s au domaine sont \u00e9galement omis.<\/p>\n<h2>Mise en \u0153uvre<\/h2>\n<p><\/p>\n<h4>Cr\u00e9ons des r\u00f4les, des sch\u00e9mas, une table<\/h4>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Cr\u00e9ation d'objets BDD<\/b><\/p>\n<pre><code class=\"pgsql\">CREATE ROLE store;\nCREATE SCHEMA store AUTHORIZATION store;\nCREATE TABLE store.docs\n(\n  id integer ,         --id du document\n  man_id integer , --id du gestionnaire du document\n  stat_id integer ,  --id du statut du document\n  ...\n  is_del BOOLEAN DEFAULT FALSE \n);\nALTER TABLE store.docs ADD CONSTRAINT doc_pk PRIMARY KEY (id);\nALTER TABLE store.docs OWNER TO store ;\n<\/code><\/pre>\n<p><\/p>\n<h4>Cr\u00e9ons des fonctions pour impl\u00e9menter RLS<\/h4>\n<p>\nV\u00e9rification de la possibilit\u00e9 d'ex\u00e9cuter SELECT sur la ligne<\/p>\n<p>                        <b class=\"spoiler_title\">check_select<\/b><\/p>\n<pre><code class=\"pgsql\">CR\u00c9ER OU REMPLACER LA FONCTION store.check_select ( current_id store.docs.id%TYPE ) RETOURNE boolean AS $$\nD\u00c9CLARE\n  result boolean ;\n  curr_pid integer ;\n  curr_stat_id integer ;\n  doc_man_id integer ;\nD\u00c9BUT \n  -- Le DBA a acc\u00e8s \u00e0 tous les documents\n  SI SESSION_USER = 'curr_dba'\n  ALORS\n    RETOURNER VRAI ;\n  FIN SI ;\n  --------------------------------\n\n  -- Si le document a l'\u00e9tiquette 'supprim\u00e9' - ne pas afficher dans la s\u00e9lection\n  S\u00c9LECTIONNER\n    is_del\n  DANS\n    result\n  DE\n    store.docs\n  O\u00d9\n    id = current_id ;\n SI result = VRAI\n ALORS\n   RETOURNER FAUX ;\n FIN SI ;\n --------------------------------\n\n -- Obtenir l'id de l'utilisateur actuel\n S\u00c9LECTIONNER\n   service_function.get_curr_pid ()\n DANS\n   curr_pid ;\n --------------------------------\n\n -- Obtenir l'id du gestionnaire de document\n S\u00c9LECTIONNER\n   man_id\n DANS\n   doc_man_id\n DE\n   store.docs\n  O\u00d9\n   id = current_id ;\n --------------------------------\n\n -- Si le gestionnaire de document n'est pas l'utilisateur actuel ou si le gestionnaire n'est pas assign\u00e9\n -- ajouter le document \u00e0 la s\u00e9lection\n SI doc_man_id != curr_pid OU doc_man_id EST NULL\n ALORS\n   RETOURNER VRAI  ;\n SINON\n   -- Obtenir le statut actuel du document\n   S\u00c9LECTIONNER\n     stat_id                                         \n   DANS\n     curr_statid\n   DE\n     store.docs\n   O\u00d9\n     id = current_id ;\n    \n   -- Si le statut permet de voir le document - ajouter le document \u00e0 la s\u00e9lection                     \n   SI curr_statid = 4 OU curr_statid = 9\n   ALORS\n     RETOURNER VRAI ;\n   SINON\n   -- Sinon - exclure le document de la s\u00e9lection\n     RETOURNER FAUX ;\n    FIN SI ;\n  FIN SI ;\n  --------------------------------\n\n RETOURNER FAUX ;\nFIN\n$$ LANGAGE plpgsql D\u00c9FINI PAR LA S\u00c9CURIT\u00c9 ;\nALTER FUNCTION store.check_select( store.docs.id%TYPE  ) PROPRI\u00c9TAIRE \u00c0 store ;\nREVOQUER L'EX\u00c9CUTION SUR LA FONCTION store.check_select( store.docs.id%TYPE  ) DE public; \nACCORDER L'EX\u00c9CUTION SUR LA FONCTION store.check_select( store.docs.id%TYPE  ) \u00c0 service_functions; \n<\/code><\/pre>\n<p>\nV\u00e9rification de la possibilit\u00e9 d'ex\u00e9cuter un INSERT de ligne<\/p>\n<p>                        <b class=\"spoiler_title\">check_insert<\/b><\/p>\n<pre><code class=\"pgsql\">CR\u00c9ER OU REMPLACER LA FONCTION store.check_insert ( current_id store.docs.id%TYPE ) RETOURNE boolean AS $$\nD\u00c9CLARE\n  curr_role_id integer ;\nD\u00c9BUT\n  -- Le DBA peut ajouter une ligne dans tous les cas\n  SI SESSION_USER = 'curr_dba'\n  ALORS\n    RETOURNER VRAI ;\n  FIN SI ;\n  --------------------------------\n\n -- Obtenir l'id du r\u00f4le de l'utilisateur actuel \n S\u00c9LECTIONNER\n   service_functions.current_rid()\n  DANS\n    curr_role_id ;\n --------------------------------\n\n-- Si le r\u00f4le permet de cr\u00e9er un nouveau document\n-- autoriser\nSI curr_role_id = 3 OU curr_role_id = 5     \nALORS\n  RETOURNER VRAI ;\nFIN SI ;\n--------------------------------\nRETOURNER FAUX  ;\nFIN\n$$ LANGAGE plpgsql D\u00c9FINI PAR LA S\u00c9CURIT\u00c9 ;\nALTER FUNCTION store.check_insert( store.docs.id%TYPE  ) PROPRI\u00c9TAIRE \u00c0 store ;\nREVOQUER L'EX\u00c9CUTION SUR LA FONCTION store.check_insert( store.docs.id%TYPE  ) DE public;\nACCORDER L'EX\u00c9CUTION SUR LA FONCTION store.check_insert( store.docs.id%TYPE  ) \u00c0 service_functions; \n<\/code><\/pre>\n<p>\nV\u00e9rification de la possibilit\u00e9 d'ex\u00e9cuter un DELETE de ligne<\/p>\n<p>                        <b class=\"spoiler_title\">check_delete<\/b><\/p>\n<pre><code class=\"pgsql\">CR\u00c9ER OU REMPLACER LA FONCTION store.check_delete ( current_id store.docs.id%TYPE )\nRETOURNE boolean AS $$\nD\u00c9BUT  \n  -- Seul le DBA peut supprimer une ligne \n  SI SESSION_USER = 'curr_dba'\n  ALORS\n    RETOURNER VRAI ;\n  FIN SI ;\n  --------------------------------\n\n  RETOURNER FAUX ;\nFIN\n$$ LANGAGE plpgsql\nD\u00c9FINI PAR LA S\u00c9CURIT\u00c9 ;\nALTER FUNCTION store.check_delete( store.docs.id%TYPE  ) PROPRI\u00c9TAIRE \u00c0 store ;\nREVOQUER L'EX\u00c9CUTION SUR LA FONCTION store.check_delete( store.docs.id%TYPE  ) DE public;<\/code><\/pre>\n<p>\nV\u00e9rification de la possibilit\u00e9 d'ex\u00e9cuter un UPDATE de ligne.<\/p>\n<p>                        <b class=\"spoiler_title\">mise_\u00e0_jour_utiliser<\/b><\/p>\n<pre><code class=\"pgsql\">CR\u00c9ER OU REMPLACER LA FONCTION store.update_using ( current_id store.docs.id%TYPE , is_del boolean )\nRETURNS boolean AS $$\nBEGIN  \n   --Les documents ayant le statut 'supprim\u00e9' ne peuvent pas \u00eatre modifi\u00e9s\n   IF is_del \n   THEN\n     RETURN FALSE ;\n ELSE\n    RETURN TRUE ;\n  END IF ;\n\nEND\n$$ LANGUAGE plpgsql SECURITY DEFINER;\nALTER FUNCTION store.update_using( store.docs.id%TYPE , boolean ) OWNER TO store ;\nREVOKE EXECUTE ON FUNCTION store.update_using( store.docs.id%TYPE , boolean ) FROM public;\nGRANT EXECUTE ON FUNCTION store.update_using( store.docs.id%TYPE ) TO service_functions;<\/code><\/pre>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">mise_\u00e0_jour_v\u00e9rification<\/b><\/p>\n<pre><code class=\"pgsql\">CR\u00c9ER OU REMPLACER LA FONCTION store.update_with_check ( current_id store.docs.id%TYPE , is_del boolean )\nRETURNS boolean AS $$\nDECLARE\n  current_rid integer ;\n  current_statid integer ;\nBEGIN                \n\n  --Le DBA peut consulter la ligne \n  IF SESSION_USER = 'curr_dba'\n  THEN\n    RETURN TRUE ;\n  END IF ;\n  --------------------------------\n\n --Obtenir l'id du r\u00f4le de l'utilisateur actuel \n SELECT\n   service_functions.current_rid()\n  INTO\n    curr_role_id ;\n --------------------------------                            \n\n --Suppression du document - modification du flag \n IF is_deleted\n THEN\n   --Si le r\u00f4le de l'utilisateur ***\n   IF current_role_id = 3        \n   THEN\n      SELECT\n        stat_id                                          \n      INTO\n        curr_statid\n      FROM\n        store.docs\n      WHERE\n        id = current_id ;\n\n      --Le document au statut *** ne peut pas \u00eatre supprim\u00e9 \n      IF current_status_id = 11\n      THEN\n         RETURN FALSE ;\n      ELSE\n      --Le document peut \u00eatre supprim\u00e9 dans d'autres statuts\n        RETURN TRUE ;\n      END IF ;\n\n    --Sinon, si le r\u00f4le de l'utilisateur ***\n    ELSIF current_role_id = 5            \n    THEN\n      --Tous les statuts du document \n      RETURN TRUE ;\n    ELSE\n      --D'autres utilisateurs ne peuvent pas supprimer des documents\n      RETURN FALSE ;\n    END IF ;\n ELSE      \n   --La mise \u00e0 jour du document est autoris\u00e9e\n    RETURN TRUE ;\nEND IF ;\n\nRETURN FALSE ;\nEND\n$$ LANGUAGE plpgsql SECURITY DEFINER;\nALTER FUNCTION store.update_with_check( storg.docs.id%TYPE , boolean ) OWNER TO store ;\nREVOKE EXECUTE ON FUNCTION store.update_with_check( storg.docs.id%TYPE , boolean ) FROM public;\nGRANT EXECUTE ON FUNCTION store.update_with_check( store.docs.id%TYPE ) TO service_functions;<\/code><\/pre>\n<p>\nActivation de la politique de s\u00e9curit\u00e9 au niveau des lignes pour la table.<\/p>\n<p>                        <b class=\"spoiler_title\">ACTIVER LA S\u00c9CURIT\u00c9 AU NIVEAU DES LIGNES<\/b><\/p>\n<pre><code class=\"pgsql\">ALTER TABLE store.docs ENABLE ROW LEVEL SECURITY ;\n\nCREATE POLICY doc_select ON store.docs FOR SELECT TO service_functions USING ( (SELECT store.check_select(id)) );\nCREATE POLICY doc_insert ON store.docs FOR INSERT TO service_functions WITH CHECK ( (SELECT store.check_insert(id)) );\nCREATE POLICY docs_delete ON store.docs FOR DELETE TO service_functions USING ( (SELECT store.check_delete(id)) );\n\nCREATE POLICY doc_update_using ON store.docs FOR UPDATE TO service_functions USING ( (SELECT store.update_using(id , is_del )) );\nCREATE POLICY doc_update_check ON store.docs FOR UPDATE TO service_functions WITH CHECK ( (SELECT store.update_with_check(id , is_del )) );<\/code><\/pre>\n<p><\/p>\n<h2>Conclusion<\/h2>\n<p>\nCela fonctionne.<\/p>\n<p>La strat\u00e9gie propos\u00e9e a permis de transf\u00e9rer la mise en \u0153uvre du mod\u00e8le de r\u00f4le du niveau des fonctions commerciales au niveau du stockage des donn\u00e9es. <\/p>\n<p>Les fonctions peuvent \u00eatre utilis\u00e9es comme mod\u00e8le pour mettre en \u0153uvre des mod\u00e8les de masquage de donn\u00e9es plus sophistiqu\u00e9s, si les exigences commerciales l'exigent.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/516040\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0442\u0435\u043c\u044b \u042d\u0442\u044e\u0434 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Row Level Secutity \u0432 PostgreSQL \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u00ab\u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u0432 \u0411\u0414\u00bb, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u2014 \u042d\u0442\u044e\u0434 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 PostgreSQL \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Postgres Pro \u2014 \u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u0441\u0442\u0440\u043e\u043a. \u041d\u0438\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92115,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92114","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0442\u0435\u043c\u044b \u042d\u0442\u044e\u0434 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Row Level Secutity \u0432 PostgreSQL \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u043e\u043b\u0435\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Row Level Security \u0432 PostgreSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0442\u0435\u043c\u044b \u042d\u0442\u044e\u0434 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Row Level Secutity \u0432 PostgreSQL \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-23T17:41:56+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-23T17:41:56+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Mise en \u0153uvre d'un mod\u00e8le d'acc\u00e8s bas\u00e9 sur les r\u00f4les avec l'utilisation de la s\u00e9curit\u00e9 au niveau des lignes dans PostgreSQL | ProHoster","description":"D\u00e9veloppement du sujet d'\u00e9tude sur la mise en \u0153uvre de la s\u00e9curit\u00e9 au niveau des lignes dans PostgreSQL et pour une r\u00e9ponse d\u00e9taill\u00e9e sur","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u043e\u043b\u0435\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Row Level Security \u0432 PostgreSQL | ProHoster","og:description":"\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0442\u0435\u043c\u044b \u042d\u0442\u044e\u0434 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Row Level Secutity \u0432 PostgreSQL \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-23T17:41:56+00:00","article:modified_time":"2020-08-23T17:41:56+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92114","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:14:23","updated":"2022-10-06 10:04:45","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/92114","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=92114"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/92114\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/92115"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=92114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=92114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=92114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}