Как разграничить доступ к данным на уровне сервера базы данных?
В БД у меня есть три роли: гость, клиент и администратор. В моем проекте django есть три соединения под этими ролями
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'test',
'USER': 'guest',
'PASSWORD': 'guest',
'HOST': 'localhost',
'PORT': 5432,
},
'admin': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'test',
'USER': 'admin',
'PASSWORD': 'admin',
'HOST': 'localhost',
'PORT': 5432,
},
'customer': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'test',
'USER': 'customer',
'PASSWORD': 'customer',
'HOST': 'localhost',
'PORT': 5432,
}
}
Как и где я могу изменить подключение к базе данных в зависимости от того, аутентифицирован пользователь или нет?
Я предполагаю, что вы используете psycopg2 для подключения к СУБД Postgresql. Я бы указал, какого пользователя Postgresql вы хотите использовать перед выполнением запроса.
Например:
import psycopg2
def func1():
conn = psycopg2.connect(database = "exampledb", user = "user1", password = "user1password", host = "127.0.0.1", port = "5432")
cur = conn.cursor()
cur.execute("SELECT * FROM schema_name.table_name;")
rows = cur.fetchall()
for row in rows:
print(row)
def func2():
conn = psycopg2.connect(database = "exampledb", user = "user2", password = "user2password", host = "127.0.0.1", port = "5432")
cur = conn.cursor()
cur.execute("INSERT INTO schema_name.table_name (col1, col2) VALUES(1, 2);")
rows = cur.fetchall()
for row in rows:
print(row)
Я бы также был очень осторожен с пользователем admin, с точки зрения безопасности я бы не разрешил использовать эту учетную запись для серверных сценариев, потому что если sql-инъекция будет выполнена, то может быть нанесен большой вред. Для предотвращения sql-инъекций в python я бы рекомендовал следующее: https://realpython.com/prevent-python-sql-injection/