【问题标题】:Django. How to expire all user passwords?姜戈。如何使所有用户密码过期?
【发布时间】:2013-06-06 08:56:27
【问题描述】:

我有一个拥有几千名注册用户的网站。万一有人从我的数据库中窃取了密码,我希望有一个 plan A 和一个 plan B。我猜B计划是更改所有用户密码(使用一个小的python脚本和一个随机密码生成器)并将这些新密码通过电子邮件发送给用户。我可以轻松做到这一点。

A 计划(听起来更合适,我不知道该怎么做)将强制用户通过使旧密码过期来创建新密码,在攻击后他们第一次访问该页面时。

Django 有这样的功能吗?怎样才能高效、快速地完成?

注意:目前我的用户/用户配置文件模型在设计时并未考虑到这种情况。

【问题讨论】:

  • 用户的会话在哪里(如果是db,需要清除会话集合/表)?您只需从 您的 服务器 中删除所有活动会话
  • 我认为 A 计划比 B 计划好得多。您需要清除会话数据库并创建“忘记密码”视图或类似视图。同时,您只需清空数据库中的所有密码并等待用户重置它们。
  • 用户会话位于数据库中。
  • @TimmyO'Mahony 忘记密码功能听起来很合理。如果会话存储在数据库中。 +1
  • @TimmyO'Mahony FYI 刚刚检查用户模型中的密码字段是必填字段。你不能在那里设置空值。

标签: django


【解决方案1】:

您应该做的第一件事是停用所有用户,使他们无法登录。一种方法是使用set_unusable_password()。这将使所有密码无效;或者您可以将is_active 设置为False。这将禁用用户批发。

接下来,您可以让用户重置他们的密码。还有built-in helpers and forms

【讨论】:

  • +1 链接到set_unusable_password,我从来不知道。
  • 感谢set_unusable_password()。因此,假设我已使所有密码无法使用,并以某种方式强制用户自动重定向到密码更改表单。新密码还能再用吗?
  • 是的,如果将无法使用的密码换成其他密码,就可以再次使用了。
【解决方案2】:

我认为你应该选择 B 计划。检查Management Commands

from django.core.management.base import NoArgsCommand
from django.contrib.auth.models import User

class Command(NoArgsCommand):
    help = _('Change password of all users.')
    def handle_noargs(self, **options):
        users = User.objects.all()
        for user in users:
            # generate random password
            random_pwd = 'some random password'
            user.set_password(random_pwd)
            user.save()
            # send email to user

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2020-10-18
    • 2020-08-17
    • 2019-08-02
    • 2011-02-27
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多