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

时间:2011-02-27 10:58:44

标签: python django passwords

当用户登录时,他提供了他的名字和原始密码,经过哈希处理并与db的值进行比较。


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 个答案:

答案 0 :(得分:2)

您可以将其存储在登录视图功能的会话数据中。至少它会因会话而死亡。如果某个黑客获得了数据库访问权限,那么将其存放在数据库字段中的另一个选项将是可怕的。至少如果黑客在会话中使用密码访问数据库,他们只能获得当前会话的纯文本密码。确保适当地超时会话,或鼓励用户在注销时注销并删除会话数据。

答案 1 :(得分:1)

这是另一个想法。不需要su的密码验证。而是使用/ etc / sudoers允许您的Web服务器用户以其他用户身份运行。这样您还可以限制可以运行的命令 - 当前视图是否可以防止将内容注入命令行?

通过这种方式,您无需保留用户密码,只需提供一个用户名(wwwuser)即可获得所需的权限。 Django已经决定了用户是谁来登录的,所以我认为给它足够的私人来做那些用户的事情是没有问题的。

答案 2 :(得分:0)

您需要访问明文密码。理想情况下,您将存储该值并重新生成哈希以进行身份​​验证。为了安全起见,您还应该使用站点密码对其进行加密。我自己implemented this,但不是Django。您必须重新编写Django的身份验证代码才能实现这一点。