SQLAlchemy psycopg2.errors.InsufficientPrivilege:拒绝对表<<table>>的权限

16

我已经阅读了20多个不同的问题,都有相同的问题 - 建议的答案没有解决我的问题。 我仍然收到sqlalchemy psycopg2.errors.InsufficientPrivilege: permission denied for relation <<table>>错误消息。

环境:EC2,debian 8,postgresql,flask,sqlalchemy 我在postgresql中的表:

Create table Members(
id BIGSERIAL PRIMARY KEY,
joinDate TIMESTAMPTZ DEFAULT Now(),
password TEXT NOT NULL
);

在PostgreSQL中直接执行:INSERT INTO members (password) VALUES('123') RETURNING id;可以完美地运行。

我已经授予我的用户所有可能的授权。

grant all privileges on database <my_db> to <my_user>
grant all privileges on all table in schema public to <my_user>
grant all privileges on all relations in schema public to <my_user>

我还创建了一个.htaccess文件,放在var/www/html下面,并添加了Header set Access-Control-Allow-Origin "*"

我的表与sqlalchemy的member.py进行了映射

from datetime import datetime
from sqlalchemy import create_engine, Column, String, Integer, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from marshmallow import Schema, fields
from sqlalchemy.schema import UniqueConstraint
import sqlalchemy as sa

Engine = create_engine('postgresql://<my_user>:<my_psw>@<my_db_url>/<my_dn_name>')
Session = sessionmaker(bind=Engine)
Base = declarative_base()

class MemberSchema(Schema):
    id = fields.Number()    
    password = fields.Str()

class Member(Base):
    __tablename__ = 'members'

    id = Column(Integer, primary_key=True)
    password = Column(String)

    def __init__(self, password):
        self.password = password

处理POST请求并将其插入 test.py 中的代码:

Translated content:

Processing the POST request and inserting it into test.py in code:

from flask import Flask, render_template, request,jsonify
from flask_cors import CORS, cross_origin
import logging

def register_member(password):
    session = Session()
    newMember = Member(password)
    session.add(newMember)
    session.commit()
    return newMember

app = Flask(__name__)
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'

@app.route("/register", methods=["GET", "POST"])
@cross_origin()    
def register():
    try:
        formData = request.form
        register_member(formData['password'])
        return jsonify({"message":"Regsitrated successfully!"})
    except Exception as ex:
        logging.debug(ex)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=1234, debug=True)

执行此代码会导致异常,出现以下错误:

DEBUG:root:(psycopg2.errors.InsufficientPrivilege) permission denied for relation members

[SQL: INSERT INTO members (password) VALUES (%(password)s) RETURNING members.id]
[parameters: {'password': '4444'}]

TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.

希望能得到任何帮助,感激不尽。


1
出于好奇,你最终解决了这个问题吗?我现在也遇到了同样的情况 :P - n1c9
4个回答

12

您可能正在使用 psqlpgAdmin 进行手动测试,但请确保使用的帐户与代码中使用的帐户相同。

即使用户可以访问模式中的表/关系,他们也需要访问模式本身:grant usage on schema public to <myuser>

此外,我注意到使用了 BIGSERIAL,这涉及到一个序列。您可能需要执行以下操作:grant usage on all sequences in schema public to <myuser>.


7

在PostgreSQL数据库中似乎有几个层级的权限。如果缺少某个层级的权限,查询将失败。

  1. 数据库:GRANT ALL PRIVILEGES ON DATABASE thedatabse TO theotheruser;
  2. 每个架构
  3. 每个表
  4. 每个序列

对于第2到第4个层级,它取决于数据库的结构,但无论结构如何,都需要在每个层级的每个项目中更改权限,这可能需要大量的输入和/或点击或复杂的查询。


这对我起作用了,由于某种原因,权限是在表级别上的,步骤3修复了它。 - Eric
这对我也起作用了。虽然我也会在模式上添加权限,但根据@Eric的说法,那似乎不是关键。 - W1ck3d
没错,对我来说是第四步,主键的自增使用了一个序列。无论如何,为了让人们开始: GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO user; - JBSnorro
PostgreSQL具有繁琐的权限系统,不太用户友好,对于那些来自MySQL的用户尤其如此。 - Mohammed Shareef C

1

这是我使用PgAdmin中的Grant Wizard生成的查询语句,最终可以让我使用psycopg2连接到数据库:

GRANT ALL ON TABLE public.table1 TO <username>;

GRANT ALL ON TABLE public.table2 TO <username>;

GRANT ALL ON TABLE public.table3 TO <username>;

你可以尝试安装PgAdmin并使用相同的工具,它可以很好地工作。

请注意,如果您要在生产环境中部署,请确保授予特定用户的所有权限是您真正想要的,并且该用户不会受到外部威胁的影响。 - Simas Joneliunas

-2

将权限授予用户将不起作用,只需使用您在Flask/Django设置中提供的相同用户创建表格即可。

这就是我的做法,我知道我有点晚了,但希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接