{"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\/sv\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql","title":{"rendered":"Genomf\u00f6rande av en rollbaserad \u00e5tkomstmodell med hj\u00e4lp av Row Level Security i PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Utveckling av \u00e4mnet <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515896\/\">Studie om genomf\u00f6rande av Row Level Security i PostgreSQL<\/a><\/noindex> och <b>f\u00f6r ett utf\u00f6rligt svar<\/b> till <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515628\/#comment_21973176\">kommentar.<\/a><\/noindex><\/p>\n<p>Den anv\u00e4nda strategin inneb\u00e4r konceptet \"Aff\u00e4rslogik i databasen\", vilket beskrivits mer detaljerat h\u00e4r \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/515628\/\">Studie om genomf\u00f6rande av aff\u00e4rslogik p\u00e5 niv\u00e5n av lagrade funktioner i PostgreSQL<\/a><\/noindex><\/p>\n<p>Den teoretiska delen \u00e4r utm\u00e4rkt beskriven i dokumentationen <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\">Radernas skyddspolicyer<\/a><\/noindex>. Nedan diskuteras en praktisk till\u00e4mpning <b>av en specifik aff\u00e4rsuppgift \u2014 en rollbaserad \u00e5tkomstmodell till data.<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Genomf\u00f6rande av en rollbaserad \u00e5tkomstmodell med hj\u00e4lp av Row Level Security i PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/08\/df69397b8638421732a67e457c99857c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p>Artikeln inneh\u00e5ller ingenting nytt, inga dolda betydelser eller hemliga insikter. Det \u00e4r bara en skiss av praktisk till\u00e4mpning av en teoretisk id\u00e9. Om n\u00e5gon \u00e4r intresserad \u2014 l\u00e4s. Om inte \u2014 sl\u00f6sa inte din tid.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Uppgiftsst\u00e4llande<\/h2>\n<p>\nDet \u00e4r n\u00f6dv\u00e4ndigt att begr\u00e4nsa \u00e5tkomst till att visa\/infoga\/\u00e4ndra\/ta bort dokument i enlighet med anv\u00e4ndarens roll i applikationen. Med roll avses en post i tabellen <b>roles<\/b> kopplad med en m\u00e5nga-till-m\u00e5nga-relation till tabellen <b>users<\/b>. Detaljer om genomf\u00f6rande av tabeller utel\u00e4mnas p\u00e5 grund av trivialitet. Specifika detaljer relaterade till \u00e4mnesomr\u00e5det har ocks\u00e5 utel\u00e4mnats.<\/p>\n<h2>Implementering<\/h2>\n<p><\/p>\n<h4>Vi skapar roller, scheman och tabeller<\/h4>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Skapande av databasobjekt<\/b><\/p>\n<pre><code class=\"pgsql\">CREATE ROLE store;\nCREATE SCHEMA store AUTHORIZATION store;\nCREATE TABLE store.docs\n(\n  id integer ,         --dokumentets id\n  man_id integer , --dokumentets manager id\n  stat_id integer ,  --dokumentets status id\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>Vi skapar funktioner f\u00f6r att genomf\u00f6ra RLS<\/h4>\n<p>\nKontroll av m\u00f6jligheten att utf\u00f6ra SELECT p\u00e5 en rad<\/p>\n<p>                        <b class=\"spoiler_title\">check_select<\/b><\/p>\n<pre><code class=\"pgsql\">SKAPA ELLER ERS\u00c4TT FUNKTION store.check_select ( current_id store.docs.id%TYPE ) RETURNERAR boolean AS $$\nDECLARERA\n  resultat boolean ;\n  curr_pid integer ;\n  curr_stat_id integer ;\n  doc_man_id integer ;\nB\u00d6RJA \n  -- DBA har \u00e5tkomst till alla dokument\n  IF SESSION_USER = 'curr_dba'\n  D\u00c5\n    RETURERA TRUE ;\n  SLUTA ;\n  --------------------------------\n\n  --Om dokumentet har etiketten 'borttaget' - visa inte i urvalet\n  V\u00c4LJ\n    is_del\n  IN\n    resultat\n  FR\u00c5N\n    store.docs\n  WHERE\n    id = current_id ;\n IF resultat = TRUE\n THEN\n   RETURERA FALSE ;\n SLUTA ;\n --------------------------------\n\n --H\u00e4mta id f\u00f6r nuvarande anv\u00e4ndare\n V\u00c4LJ\n   service_function.get_curr_pid ()\n IN\n   curr_pid ;\n --------------------------------\n\n --H\u00e4mta id f\u00f6r dokumentets ansvarige\n V\u00c4LJ\n   man_id\n IN\n   doc_man_id\n FR\u00c5N\n   store.docs\n WHERE\n   id = current_id ;\n --------------------------------\n\n --Om dokumentets ansvarige inte \u00e4r nuvarande anv\u00e4ndare eller ansvarig inte \u00e4r angiven\n --l\u00e4gg till dokumentet i urvalet\n IF doc_man_id != curr_pid OR doc_man_id \u00c4R NULL\n THEN\n   RETURERA TRUE  ;\n ANNARS\n   --H\u00e4mta dokumentets nuvarande status\n   V\u00c4LJ\n     stat_id                                         \n   IN\n     curr_statid\n   FR\u00c5N\n     store.docs\n   WHERE\n     id = current_id ;\n    \n   --Om status till\u00e5ter att dokumetet visas - l\u00e4gg till dokumentet i urvalet                     \n   IF curr_statid = 4 ELLER curr_statid = 9\n   D\u00c5\n     RETURERA TRUE ;\n   ANNARS\n   --Annars - uteslut dokumentet fr\u00e5n urvalet\n     RETURERA FALSE ;\n    SLUTA ;\n  SLUTA ;\n  --------------------------------\n\n RETURERA FALSE ;\nSLUTA\n$$ SPR\u00c5K plpgsql SECURITY DEFINER;\nALTERERA FUNKTION store.check_select( store.docs.id%TYPE  ) \u00c4GARE TILL store ;\n\u00c5TERKALLA UTF\u00d6RANDE P\u00c5 FUNKTION store.check_select( store.docs.id%TYPE  ) FR\u00c5N public; \nBEVAKA UTF\u00d6RANDE P\u00c5 FUNKTION store.check_select( store.docs.id%TYPE  ) TILL service_functions; \n<\/code><\/pre>\n<p>\nKontrollera m\u00f6jligheten att utf\u00f6ra INSERT av en rad<\/p>\n<p>                        <b class=\"spoiler_title\">check_insert<\/b><\/p>\n<pre><code class=\"pgsql\">SKAPA ELLER ERS\u00c4TT FUNKTION store.check_insert ( current_id store.docs.id%TYPE ) RETURNERAR boolean AS $$\nDECLARERA\n  curr_role_id integer ;\nB\u00d6RJA\n  --DBA kan alltid l\u00e4gga till en rad\n  IF SESSION_USER = 'curr_dba'\n  D\u00c5\n    RETURERA TRUE ;\n  SLUTA ;\n  --------------------------------\n\n --H\u00e4mta id f\u00f6r nuvarande anv\u00e4ndarroll \n V\u00c4LJ\n   service_functions.current_rid()\n  IN\n    curr_role_id ;\n --------------------------------\n\n--Om rollen till\u00e5ter att skapa ett nytt dokument\n--till\u00e5t\nIF curr_role_id = 3 ELLER curr_role_id = 5     \nD\u00c5\n  RETURERA TRUE ;\nSLUTA ;\n--------------------------------\nRETURERA FALSE  ;\nSLUTA\n$$ SPR\u00c5K plpgsql SECURITY DEFINER;\nALTERERA FUNKTION store.check_insert( store.docs.id%TYPE  ) \u00c4GARE TILL store ;\n\u00c5TERKALLA UTF\u00d6RANDE P\u00c5 FUNKTION store.check_insert( store.docs.id%TYPE  ) FR\u00c5N public;\nBEVAKA UTF\u00d6RANDE P\u00c5 FUNKTION store.check_insert( store.docs.id%TYPE  ) TILL service_functions; \n<\/code><\/pre>\n<p>\nKontrollera m\u00f6jligheten att utf\u00f6ra DELETE av en rad<\/p>\n<p>                        <b class=\"spoiler_title\">check_delete<\/b><\/p>\n<pre><code class=\"pgsql\">SKAPA ELLER ERS\u00c4TT FUNKTION store.check_delete ( current_id store.docs.id%TYPE )\nRETURNERAR boolean AS $$\nB\u00d6RJA  \n  --Endast DBA kan ta bort en rad \n  IF SESSION_USER = 'curr_dba'\n  D\u00c5\n    RETURERA TRUE ;\n  SLUTA ;\n  --------------------------------\n\n  RETURERA FALSE ;\nSLUTA\n$$ SPR\u00c5K plpgsql\nSECURITY DEFINER;\nALTERERA FUNKTION store.check_delete( store.docs.id%TYPE  ) \u00c4GARE TILL store ;\n\u00c5TERKALLA UTF\u00d6RANDE P\u00c5 FUNKTION store.check_delete( store.docs.id%TYPE  ) FR\u00c5N public;<\/code><\/pre>\n<p>\nKontrollera m\u00f6jligheten att utf\u00f6ra UPDATE av en rad.<\/p>\n<p>                        <b class=\"spoiler_title\">uppdatera_anv\u00e4nder<\/b><\/p>\n<pre><code class=\"pgsql\">SKAPA ELLER ERS\u00c4TT FUNKTION store.update_using ( current_id store.docs.id%TYPE , is_del boolean )\nRETURNS boolean SOM $$\nB\u00d6RJA  \n   --Dokumenten med status 'borttagen' - kan inte redigeras\n   OM is_del \n   D\u00c5\n     RETURN FALSE ;\n ANNARS\n    RETURN TRUE ;\n  SLUT OM ;\n\nSLUT\n$$ SPR\u00c5K plpgsql S\u00c4KERHETSF\u00d6RDELARE;\nALTER FUNKTION store.update_using( store.docs.id%TYPE , boolean ) \u00c4GARE TILL store ;\n\u00c5TERKALLA K\u00d6RNING P\u00c5 FUNKTION store.update_using( store.docs.id%TYPE , boolean ) FR\u00c5N offentlig;\nGE K\u00d6RNING P\u00c5 FUNKTION store.update_using( store.docs.id%TYPE ) TILL service_functions;<\/code><\/pre>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">uppdatera_kontroll<\/b><\/p>\n<pre><code class=\"pgsql\">SKAPA ELLER ERS\u00c4TT FUNKTION store.update_with_check ( current_id store.docs.id%TYPE , is_del boolean )\nRETURNS boolean SOM $$\nDEKLARERA\n  current_rid heltal ;\n  current_statid heltal ;\nB\u00d6RJA                \n\n  --DBA kan visa raden\n  OM SESSION_USER = 'curr_dba'\n  D\u00c5\n    RETURN TRUE ;\n  SLUT OM ;\n  --------------------------------\n\n --H\u00e4mta id f\u00f6r rollen f\u00f6r den aktuella anv\u00e4ndaren\n V\u00c4LJ\n   service_functions.current_rid()\n  IN\n    curr_role_id ;\n --------------------------------                            \n\n --Borttagning av dokument - \u00e4ndra indikeringsflagga\n OM is_deleted\n D\u00c5\n   --Om anv\u00e4ndarrollen ***\n   OM current_role_id = 3        \n   D\u00c5\n      V\u00c4LJ\n        stat_id                                          \n      IN\n        curr_statid\n      FR\u00c5N\n        store.docs\n      VARF\u00d6R\n        id = current_id ;\n\n      --Dokument i status *** kan inte tas bort\n      OM current_status_id = 11\n      D\u00c5\n         RETURN FALSE ;\n      ANNARS\n      --Kan ta bort dokument i andra statusar\n        RETURN TRUE ;\n      SLUT OM ;\n\n    --Annars, om anv\u00e4ndarrollen ***\n    ELSIF current_role_id = 5            \n    D\u00c5\n      --Alla dokumentstatusar\n      RETURN TRUE ;\n    ANNARS\n      --Andra anv\u00e4ndare kan inte ta bort dokument\n      RETURN FALSE ;\n    SLUT OM ;\n ANNARS      \n   --Uppdatering av dokumentet \u00e4r till\u00e5ten\n    RETURN TRUE ;\nSLUT OM ;\n\nRETURN FALSE ;\nSLUT\n$$ SPR\u00c5K plpgsql S\u00c4KERHETSF\u00d6RDELARE;\nALTER FUNKTION store.update_with_check( store.docs.id%TYPE , boolean ) \u00c4GARE TILL store ;\n\u00c5TERKALLA K\u00d6RNING P\u00c5 FUNKTION store.update_with_check( store.docs.id%TYPE , boolean ) FR\u00c5N offentlig;\nGE K\u00d6RNING P\u00c5 FUNKTION store.update_with_check( store.docs.id%TYPE ) TILL service_functions;<\/code><\/pre>\n<p>\nAktivera politiken f\u00f6r radniv\u00e5s\u00e4kerhet f\u00f6r tabellen.<\/p>\n<p>                        <b class=\"spoiler_title\">AKTIVERA RADNIV\u00c5S\u00c4KERHET<\/b><\/p>\n<pre><code class=\"pgsql\">ALTER TABELL store.docs AKTIVERA RADNIV\u00c5S\u00c4KERHET ;\n\nSKAPA POLICY doc_select P\u00c5 store.docs F\u00d6R SELECT TILL service_functions ANV\u00c4ND ( (V\u00c4LJ store.check_select(id)) );\nSKAPA POLICY doc_insert P\u00c5 store.docs F\u00d6R INSERT TILL service_functions MED KONTROLL ( (V\u00c4LJ store.check_insert(id)) );\nSKAPA POLICY docs_delete P\u00c5 store.docs F\u00d6R DELETE TILL service_functions ANV\u00c4ND ( (V\u00c4LJ store.check_delete(id)) );\n\nSKAPA POLICY doc_update_using P\u00c5 store.docs F\u00d6R UPDATE TILL service_functions ANV\u00c4ND ( (V\u00c4LJ store.update_using(id , is_del )) );\nSKAPA POLICY doc_update_check P\u00c5 store.docs F\u00d6R UPDATE TILL service_functions MED KONTROLL ( (V\u00c4LJ store.update_with_check(id , is_del )) );<\/code><\/pre>\n<p><\/p>\n<h2>Resultat<\/h2>\n<p>\nDet fungerar.<\/p>\n<p>Den f\u00f6reslagna strategin m\u00f6jliggjorde \u00f6verf\u00f6ringen av implementeringen av rollmodellen fr\u00e5n aff\u00e4rsfunktionsniv\u00e5n till datalagringsniv\u00e5n. <\/p>\n<p>Funktioner kan anv\u00e4ndas som mall f\u00f6r att implementera mer avancerade modeller f\u00f6r dataskydd, om aff\u00e4rskraven kr\u00e4ver det.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/realizacziya-rolevoj-modeli-dostupa-s-ispolzovaniem-row-level-security-v-postgresql\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Implementering av en rollbaserad \u00e5tkomstmodell med Row Level Security i PostgreSQL | ProHoster","description":"Utvecklingen av \u00e4mnet Etude om implementering av Row Level Security i PostgreSQL och f\u00f6r ett utf\u00f6rligt svar p\u00e5","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/92114","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=92114"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/92114\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/92115"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=92114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=92114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=92114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}