Применение общих пользовательских функций аутентификации к нескольким проектам Flask

Я создал класс, который аутентифицирует пользователей на основе пользовательского сервера нашей компании. Я хотел бы применить его к любому из наших приложений Flask, которые используют Flask-Login, а не повторять код в каждом проекте. Я не уверен, какой правильный шаблон для этого или как его реализовать.

Я подумал о нескольких вариантах:

  1. Модуль Python — простая аутентификация, модуль будет выполнять вход в систему, а затем что-то возвращать (возможно, учетные данные или токен).
  2. «Приложение» Flask — аутентифицирует, включает экран входа и выхода и каким-то образом связывается с @login_manager.user_loader. Проблема, которую я вижу, заключается в том, что загруженный пользователь может иметь любую пользовательскую схему приложения.

Каков хороший шаблон для реализации этой общей аутентификации для нескольких проектов?


person Jono    schedule 11.08.2015    source источник


Ответы (1)


Извлеките общие функции настройки диспетчера Flask-Login и настраиваемые представления/функции входа в систему, которые вам нужны, в простой пакет расширения Flask. Установите этот пакет с помощью pip в среде каждого проекта и используйте его при создании приложения Flask для этого проекта.

company_auth/company_auth.py

from flask import Blueprint, redirect, url_for, render_template
from flask_login import LoginManager
from flask_wtf import Form

bp = Blueprint('auth', __name__)

class LoginForm(Form):
    # define your login form

@bp.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()

    if form.validate_on_submit():
        # do custom login stuff
        return redirect(url_for('index'))

    return render_template('auth/login.html', form=form)

def init_app(app, user_model):
    # have to pass in the user model since it's different between apps

    login_manager = LoginManager()
    login_manager.login_view = 'auth.login'

    @login_manager.user_loader
    def company_user_loader(id):
        user = user_model.query.get(id)
        # do custom user loading stuff
        return user

    app.register_blueprint(bp, url_prefix='/auth')

company_auth/setup.py

#!/usr/bin/env python
from setuptools import setup, find_packages

setup(
    name='company_auth',
    version='1.0',
    py_modules=['company_auth'],
    url='http://davidism.com/',
    license='BSD',
    author='davidism',
    author_email='[email protected]',
    description='Flask extension for company auth',
    requires=['flask']
)

Создайте дистрибутив пакета для установки в других проектах.

$ python setup.py sdist

Для каждого проекта установите пакет, импортируйте и запустите функцию init_app и предоставьте шаблоны аутентификации. (Ваше расширение также может включать шаблоны по умолчанию, но этот ответ станет гигантским, если я пойду по этому пути. См. Flask-Security для примера шаблонов по умолчанию.)

$ project_env/bin/activate
$ pip install /path/to/company_auth/dist/company_auth-1.0.tar.gz

Создайте шаблоны авторизации:

project/
    templates/
        auth/
            login.html
    app.py

Настройте приложение с пользовательской аутентификацией:

import company_auth
company_auth.init_app()
person davidism    schedule 11.08.2015