Какой самый чистый способ добавить код в contrib.auth - PullRequest
1 голос
/ 17 ноября 2009

Я перенес старую установку Joomla в Django. Хэши паролей - это проблема. Мне пришлось изменить get_hexdigest в contrib.auth.models, чтобы иметь дополнительный оператор if, чтобы изменить способ генерирования хеша.

# Custom for Joomla
if algorithm == 'joomla':
    return md5_constructor(raw_password + salt).hexdigest()
# Djangos original md5
if algorithm == 'md5':
    return md5_constructor(salt + raw_password).hexdigest()

Я также добавил в модель User следующее, чтобы обновить пароли после входа в систему, если они имеют старый стиль joomla:

# Joomla Backwards compat
algo, salt, hsh = self.password.split('$')
if algo == 'joomla':
    is_correct = (hsh == get_hexdigest(algo, salt, raw_password))
    if is_correct:
        # Convert the password to the new more secure format.
        self.set_password(raw_password)
        self.save()
    return is_correct

Все работает отлично, но я бы не стал редактировать этот код непосредственно в дереве django. Есть ли более чистый способ сделать это в моем собственном проекте?

Спасибо

Ответы [ 2 ]

6 голосов
/ 17 ноября 2009

Лучше всего было бы создать пользовательский аутентификационный бэкэнд и переписать туда get_hexdigest. Сам никогда этого не делал, но документация о том, как это сделать, доступна на http://docs.djangoproject.com/en/dev/topics/auth/#authentication-backends.

0 голосов
/ 07 ноября 2011

Спасибо за руководство. Для тех, кому нужно пойти другим путем (DJango - Joomla) с паролями DJ, формат DJ - Sha1$salt$crypt.

Joomla стандартный плагин auth и ядро ​​joomla JUserHelper не реализуют один и тот же алгоритм SHA1, но довольно просто установить паттерн в joomla.php в этом плагине, где плагин обычно выполняет взрыв на ':'. Сделайте взрыв из трех частей с помощью '$' и используйте salt = [1], сравните это с $encrypted = sha1($salt.$plaintext), сопоставьте это с crypt [2].

...