Моя команда разрабатывает защищенный проект django, и мы добавили запрос Django в пользовательский бэкэнд базы данных.
Мы создали такой алгоритм для аутентификации GSSAPI (SPNEGO) в django и делегирования учетных данных пользователя для запросов к серверу от имени пользователя:
if 'HTTP_AUTHORIZATION' in request.META:
kind, initial_client_token = request.META['HTTP_AUTHORIZATION'].split(' ', 1)
if kind == 'Negotiate':
server = 'HTTP@server.domain.ru'
_ignore_result, krb_context = kerberos.authGSSServerInit(server)
kerberos.authGSSServerStep(krb_context, initial_client_token)
principal = kerberos.authGSSServerUserName(krb_context)
_ignore_result = kerberos.authGSSServerStoreDelegate(krb_context)
conn = psycopg2.connect(
host='krb5-dbhost',
user=principal,
dbname='db',
)
cursor = conn.cursor()
cursor.execute("SELECT version()")
records = cursor.fetchall()
, это хорошо работает в django-view.Сервер Kerberos может авторизовать пользователя и кеш-билет krb5 для делегирования полномочий для запроса в psycopg.Теперь нам нужно внедрить его в django.
Мы хотим, чтобы наследовать базу данных postgresql, вот так:
from django.db.backends.postgresql_psycopg2.base import DatabaseWrapper
class CustomDatabaseWrapper(DatabaseWrapper):
def __init__(self, *args, **kwargs):
super(CustomDatabaseWrapper, self).__init__(*args, **kwargs)
def get_connection_params(self):
'''We need to customize this function,
We need get request here when query processed by web interface,'''
#.... the source code could be here, but it is not necessary
return conn_params
Итак, вопрос: «Как мы можем получить request.META (для полученияпользовательский токен согласования) в функции get_connection_params () и как мы можем отделить пользовательский запрос от веб-интерфейса от команд управления. "
Извините за мои навыки английского языка. Спасибо!