当用户登录时,他提供了他的名字和原始密码,经过哈希处理并与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
如何存储原始用户的密码并将其替换为所需的功能?
答案 0 :(得分:2)
您可以将其存储在登录视图功能的会话数据中。至少它会因会话而死亡。如果某个黑客获得了数据库访问权限,那么将其存放在数据库字段中的另一个选项将是可怕的。至少如果黑客在会话中使用密码访问数据库,他们只能获得当前会话的纯文本密码。确保适当地超时会话,或鼓励用户在注销时注销并删除会话数据。
答案 1 :(得分:1)
这是另一个想法。不需要su的密码验证。而是使用/ etc / sudoers允许您的Web服务器用户以其他用户身份运行。这样您还可以限制可以运行的命令 - 当前视图是否可以防止将内容注入命令行?
通过这种方式,您无需保留用户密码,只需提供一个用户名(wwwuser)即可获得所需的权限。 Django已经决定了用户是谁来登录的,所以我认为给它足够的私人来做那些用户的事情是没有问题的。
答案 2 :(得分:0)
您需要访问明文密码。理想情况下,您将存储该值并重新生成哈希以进行身份验证。为了安全起见,您还应该使用站点密码对其进行加密。我自己implemented this,但不是Django。您必须重新编写Django的身份验证代码才能实现这一点。