Re: question on row level security - Mailing list pgsql-sql

From David G. Johnston
Subject Re: question on row level security
Date
Msg-id CAKFQuwYA04VEK7gWFj-EjMy=a9=pd2OOpy_0R5vqoEOTcz4JTA@mail.gmail.com
Whole thread Raw
In response to Re: question on row level security  (Joe Conway <mail@joeconway.com>)
List pgsql-sql
On Wed, Dec 30, 2015 at 10:32 AM, Joe Conway <mail@joeconway.com> wrote:
On 12/30/2015 08:58 AM, Tim Dudgeon wrote:
> e.g. conceptually:
>
> set app_user 'john';
> select * from foo;
>
> where the select * is restricted by a RLS check that includes 'john' as
> the app_user.
> Of course custom SQL could be generated for this, but it would be safer
> if it could be handled using RLS.
>
> Any ways to do this?

Something like this:

8<--------------------------
CREATE USER application;

CREATE TABLE t1 (id int primary key, f1 text, app_user text);
INSERT INTO t1 VALUES(1,'a','bob');
INSERT INTO t1 VALUES(2,'b','alice');
ALTER TABLE t1 ENABLE ROW LEVEL SECURITY;
CREATE POLICY P ON t1 USING (app_user =
current_setting('app_name.app_user'));
GRANT SELECT ON t1 TO application;

SET SESSION AUTHORIZATION application;

regression=> SET app_name.app_user = 'bob';
SET
regression=> SELECT * FROM t1;
 id | f1 | app_user
----+----+----------
  1 | a  | bob
(1 row)

regression=> SET app_name.app_user = 'alice';
SET
regression=> SELECT * FROM t1;
 id | f1 | app_user
----+----+----------
  2 | b  | alice
(1 row)

regression=> SET app_name.app_user = 'none';
SET
regression=> SELECT * FROM t1;
 id | f1 | app_user
----+----+----------
(0 rows)

8<--------------------------

HTH,

Joe


​I think an example like this, emphasizing the use of something other than current_user, should be considered for the documentation @


David J.

pgsql-sql by date:

Previous
From: Tim Dudgeon
Date:
Subject: Re: question on row level security
Next
From: Belju Paul
Date:
Subject: plv8 installation problem