如何在Django中重用用户的原始密码?

1 投票
3 回答
2036 浏览
提问于 2025-04-16 12:37

用户登录后,他提供了自己的名字和原始密码,这个密码经过处理后与数据库中的值进行比较。


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

问题是:一旦用户登录,后续的请求只包含一些cookies,这些cookies会被检查,用户就不需要再输入他的登录信息了。


但是,我需要在每个方法中都能获取到用户的原始密码,以便登录到Linux用户并以该用户身份执行一些Linux程序。例如,su程序就是用来切换到正确的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 个回答

0

你需要获取明文密码。理想情况下,你应该存储这个密码,并重新生成哈希值来进行身份验证。为了安全起见,你还应该用网站的密码对它进行加密存储。我自己有过这样的实现,但不是针对Django的。如果想要做到这一点,你需要重新编写Django的身份验证代码。

1

这里有另一个想法。不要要求在使用su命令时输入密码。可以通过修改/etc/sudoers文件,允许你的网页服务器用户以其他用户的身份运行命令。这样,你还可以限制可以运行哪些命令——你现在的设置能防止有人往命令行里注入恶意代码吗?

这样一来,你就不需要保存用户的密码了,只需给一个用户名(比如wwwuser)赋予它所需的权限。Django已经根据登录信息确定了用户,所以我认为给它足够的权限去执行该用户的操作是没有问题的。

2

你可以把它存储在登录视图函数的会话数据里。这样的话,它就会随着会话的结束而消失。另一种选择是把它放在数据库的某个字段里,但如果黑客入侵了数据库,那就太糟糕了。至少如果黑客得到了数据库的访问权限,他们只能看到当前会话的明文密码,而不是存储在数据库里的所有密码。记得要合理设置会话的超时时间,或者鼓励用户在退出时注销并清除会话数据。

撰写回答