Давайте поговорим сегодня о том, как можно упростить администрирование и обеспечить двухфакторную авторизацию пользователей для более безопасной работы в Django.Django – это фреймворк для работы с данными с использованием доступа через Web. Один из видов MVC — и называется MVT.Нередко при реализации модуля администрирования в Django требуется передача пользователю информации о том, что ему дали доступ к серверу с указанием имени пользователя и пароля.Для таких случаев возможна следующая реализация (использованы Centos 7, Python 2.7, Django 1.11):Администратор добавляет в систему пользователя, внутри системы генерируется пароль (который не доступен администратору);Имя и пароль пользователя отправляется на указанный для пользователя почтовый ящик;Пользователь вводит логин и пароль, ему на ящик или на телефон приходит код доступа, который нужно ввести для дальнейшей аутентификации.Для реализации выполним следующие несложные действия:Необходимо использовать свою модель пользователей, где будут добавлены поля (файл models.py):phone(Номер телефона),is_adm(пользователи поделены на админов и на обычных пользователей),number (временное хранение кода доступа)class Profile(models.Model): username = models.OneToOneField(User) phone = models.CharField(verbose_name='Номер телефона',max_length=20, unique=True, db_index=True) is_adm = models.BooleanField(verbose_name= 'админ' , default= False) number = models.CharField(verbose_name='код', max_length=10, blank=True)Изменим вид формы заполнения данных о пользователе, где заранее установим значение пароля по умолчанию равным, например, ‘Aa12345678’(файл forms.py):class UserForm(UserCreationForm): password1 = forms.CharField(initial='Aa12345678',widget = forms.TextInput( attrs={'class':'form-control','type':'password', 'name':'password', 'readonly': True}), # label="Пароль") password2 = NoneПри открытии формы видно, что поле «Пароль» уже заполнено и недоступно для редактирования (серый цвет). Заносим остальные данные и сохраняем.После нажатия кнопки «Сохранить», пользователь будет создан и ему на почту придет сообщение:И мы видим, что пароль установлен отличный от пароля по умолчанию.Это достигается при сохранении данных о пользователе (файл views.py — для нового пароля использован генератор случайных чисел):def form_valid(self, form): ********* passw = 'Zz' + str(randint(100000,999999)) user.set_password(passw) user.save() send_mail("Сообщение","Имя пользователя:{}, пароль: {}".format(user.username, passw), settings.EMAIL_HOST_USER, [user.email],fail_silently=False) *********Пользователь, получив сообщение, может уже входить в систему:Для дальнейшей возможности авторизации у пользователя будет запрошен разовый код:Который направлен на почтовый ящик:Или на телефон (здесь имитация реализована через сервис портала smsc.ru, с подключением файла smsc_api.py):Пользователь вводит код:Код реализации для отправки кода авторизации в файле views.py:,@login_required(login_url='/core/next') def next_sms(request): if request.user.is_superuser: title = 'Главная' content = {'title': title} return render(request, 'core/index.html', content) else: title = 'Код СМС' content = {'title': title} user = User.objects.get(username=request.user) profile = Profile.objects.get(username = user.id) #if profile.number != '': gen_number = randint(10000,99999) profile.number = str(gen_number) profile.save() # Отправка кода на почтовый ящик send_mail("subject","Your code: {}".format(gen_number), settings.EMAIL_HOST_USER, [user.email],fail_silently=False) # Отправка кода на телефон smsc = SMSC() smsc.send_sms(profile.phone, "Your code: {}".format(gen_number), sender = "sms") return render(request, 'core/next.html', content)Для отправки почтовых сообщений вносим необходимые изменения в файл settings.py:EMAIL_HOST = 'smtp' EMAIL_PORT = 465 EMAIL_HOST_USER = "пользователь@" EMAIL_HOST_PASSWORD = "дополнительный_пароль" EMAIL_USE_SSL = True SERVER_EMAIL = EMAIL_HOST_USER DEFAULT_FROM_EMAIL = EMAIL_HOST_USERТаким образом, внеся небольшие дополнения в код, можно упростить администрирование и обеспечить двухфакторную авторизацию пользователей для более безопасной работы.