Главная > web, Программирование > Flask: Создание root-пользователя в flask-security и установка хешированного пароля.

Flask: Создание root-пользователя в flask-security и установка хешированного пароля.

Вкратце:
Flask - micro web framework. По сути, тонкая обёртка вокруг wsgi-сервера werkzeug.

Flask-Security - расширение (extension) для flask, которое реализует возможность аутентификации и авторизации ("входа на сайт", другими словами - логина), регистрации пользователей. Flask-Security сам по себе использует другие сторонние расширения для реализации нужного функционала (например: flask-login для логина, flask-wtf для обработки форм).

Задача: во время инициализации БД создать пользователя с паролем. Примерно как это делает Django при первом syncdb с подключенным приложением django.contrib.auth.

Проблемы и решение:

  1. Хранить пароли в открытом виде не модно да и не безопасно. Пароль требуется защитить понятным для flask-security методом.
  2. Процедура сокрытия пароля не прозрачна на уровне ORM (в данном случае sqlalchemy).

Для инициализации БД воспользуемся расширением flask-script, которое позволяет просто реализовать CLI (command line interface - интерфейс командной строки) для некоторых действий в нашем приложении.

Версия 1: Только хардкор, только хардкод!

from flask.ext import script

import app # module with our application
from extensions import db # sqlalchemy.SQLAlchemy instance
import models # our custom models

manager = script.Manager(app.app)

@manager.command
def initdb():
"""Reset and init database."""

db.drop_all()
db.create_all()

user = models.User(
username=u'admin',
email=u'admin@example.com',
password=u'password',
)

db.session.add(user)
db.session.commit()

Запуск: python manage.py initdb
Минусы: пароль захардкожен. Flask-Security будет работать только если в настроках установлен plaintext в качестве формата паролей.

Версия 2: Убираем хардкод

Меняем:

    password=u'password',

На:
    password=raw_input('Enter initial user password: '),

Да, всё так элементарно, но сразу почему-то в голову не пришло.

Версия 3: солим и хэшируем

Добавляем импорт:

from flask.ext.security import utils

Меняем:

    password=raw_input('Enter initial user password: '),

На:
    password=utils.encrypt_password(
raw_input('Enter initial user password: ')),

Версия 4: DRY, less harcode

Убираем остальной хардкод, используем DRY (don't repeat yourself). В итоге всё выглядит так:

@manager.command
def initdb():
"""Reset and init database."""

db.drop_all()
db.create_all()

user_defaults = {
'username': 'admin',
'email': 'admin@example.com',
'password': 'admin',
}
input_msg = 'Enter %s [%s]: '
for key, value in user_defaults.iteritems():
user_defaults[key] = raw_input(input_msg % (key, value)) or value

user_defaults['password'] = utils.encrypt_password(
user_defaults['password'])

user = models.User(**user_defaults)

db.session.add(user)
db.session.commit()

Выглядит вполне симпатично. Мои познания flask ограничены 3 вечерами, но, надеюсь, в данном примере нет каких-то очевидных нелепостей.

Пожалуйста, оцените полезность и качество данной статьи. Одна звезда - плохо, 5 - хорошо.
1/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.2/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.3/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.4/5.5/5. (1 голосов, средний: 5,00 из 5)
Загрузка...
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.