'Getting 'permission denied for table foo' error even though permissions have been granted
I have logged into my database as the database owner (a superuser as well) and have created a role_write
role with nologin and noinherit flags.
I've revoked the default create permissions from the public schema with:
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
And revoked public access to the database with:
REVOKE ALL ON DATABASE mydb FROM PUBLIC;
I have granted roles on each table I want the role to be able to have read/write access. Using the user
table for this example, I have added:
grant insert, select, update, delete on users to role_write;
Then I've also given the user proper permissions for the tables, schema, sequences and database connection and altered the default privileges with:
GRANT CONNECT ON DATABASE my to role_write;
grant usage on schema public to role_write;
grant select, insert, update, delete on all tables in schema public to role_write;
grant usage, select on all sequences in schema public to role_write;
alter default privileges in schema public
grant select, insert, update, delete on tables to role_write;
alter default privileges in schema public
grant usage, select on sequences to role_write;
I have also created a new user (with noinherit flag) and have added the role_write role to this user with:
grant role_write to newuser;
Then I signed in as that user as ran:
set role role_write;
Then just to be safe, I restarted postgres.
Yet even after all that, when I try to connect to the database through sequelize/apollo server as newuser and run a query, I get the error:
permission denied for table users
I have no idea what I've done wrong. If I check the privileges of the user table it shows that role_write is correctly setup.
Any help?
EDIT: So I've realized that I need to run set role role_write
on every session, not just once. If I connect to the database and run a query straight away then I get the error, however if I first set the role then it allows me.
So my question now is...
How do I get sequelize/apollo to add set role role_write;
for each new connection to the database?
Solution 1:[1]
DEAR PEOPLE FROM THE FUTURE: Here's what we've figured out so far ...
As explained in my edit, the issue is that I created the newuser with the noinherit
flag. This causes an issue when using sequelize/apollo as the only way to get the read/write permissions from the role_write role is by first running set role role_write;
.
Maybe someone will answer with a solution that lets you send set role role_write;
with each sequelize/apollo request to the server, but for now I solved the issue by simply running alter role newuser with inherit;
. Now I don't get the error message anymore.
Solution 2:[2]
All you need to do is
ALTER ROLE newuser INHERIT;
Then newuser
will inherit the privileges from rolw_write
, and there is no need to run SET ROLE
.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Jake |
Solution 2 | Paul Whelan |