Как я могу повторно использовать необработанный пароль пользователя в django? - PullRequest
1 голос
/ 27 февраля 2011

Когда пользователь вошел в систему, он указал свое имя и необработанный пароль, который был хэширован и сравнен со значением в БД.


def login(request):
    username = request.POST['username']
    password = request.POST['password']
    user = auth.authenticate(username=username, password=password)
    if user is not None and user.is_active:
        # user is active
        auth.login(request, user)
        # relink to right page
        return HttpResponseRedirect("/account/loggedin/")
    else:
        # error page
        return HttpResponseRedirect("/account/invalid/")

или я мог бы просто использовать:


@login_required
def index(request):
    if request.user.is_authenticated():
        return render_to_response('polls/index.html', {'sessionDic' : request.session})
    else:
        #some stuff

Проблема в том, что после входа в систему следующие запросы содержат только файлы cookie, которые проверены, и пользователю не нужно повторно вводить свои учетные данные.


Но мне нужно иметь необработанный пароль пользователя в View во всех методах, чтобы войти в систему для пользователя linux и выполнить какую-либо программу linux от имени этого пользователя. Например, программа su используется для переключения пользователя ritgh linux:


def ssh_command (user, password, command):
    child = pexpect.spawn('su -l %s -c \'%s\'' % (user, command))
    i = child.expect([pexpect.TIMEOUT, pexpect.EOF, 'Password: '])
    if i == 0: # Timeout
        print 'ERROR!'
        print 'su can\'t be executed:'
        print child.before, child.after
        return None
    if i == 1: # EOF
        print 'ERROR'
        print 'EOF error'
        print child.before, child.after
        return None
    child.sendline(password)
    return child

def main ():
    user = 'test'
    password = 'test'
    child = ssh_command (user, password, 'curl habrahabr.ru | wc -c')
    child.expect(pexpect.EOF)
    print child.before
    print child.after
    print child.match

Как я могу сохранить необработанный пароль пользователя и заменить его необходимыми функциями?

Ответы [ 3 ]

2 голосов
/ 27 февраля 2011

Вы можете сохранить его в данных сеанса из функции просмотра входа в систему.По крайней мере, тогда он умрет с сеансом.Другой вариант - сохранить его в поле базы данных - был бы ужасен, если бы какой-нибудь хакер получил доступ к БД.По крайней мере, если хакер получит доступ к БД с паролями в сеансах, он получит только обычные текстовые пароли текущих сеансов.Убедитесь, что вы тайм-аут сеансов надлежащим образом, или побудите своих пользователей выйти из системы и удалить данные сеанса при выходе из системы.

1 голос
/ 28 февраля 2011

Вот еще одна идея. Не требует аутентификации по паролю для su. Вместо этого используйте / etc / sudoers, чтобы позволить вашему веб-серверу запускать вещи как другие пользователи. Таким образом, вы также можете ограничить, какие команды можно запускать - защищает ли ваше текущее представление от внедрения чего-либо в командную строку?

Таким образом, вам не нужно хранить пароли пользователей, вы просто даете одному имени пользователя (wwwuser) необходимые ему привилегии. Django уже решил, кто пользователь из логина, так что я не думаю, что есть проблема в том, чтобы дать ему достаточно привилегий, чтобы сделать что-то от этого пользователя.

0 голосов
/ 27 февраля 2011

Вам нужен доступ к паролю открытого текста. В идеале вы должны сохранить это и восстановить хеш для аутентификации. Вы должны хранить его в зашифрованном виде с паролем сайта, а также, для безопасности. Я реализовал это сам, но не для Django. Для этого вам придется переписать код аутентификации Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...