2015-08-11 5 views
2

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

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

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

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

ответ

2

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

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, и предоставить шаблоны AUTH. (Ваше расширение может включать в себя шаблоны по умолчанию тоже, но этот ответ получит гигантский, если я пойду по этому пути См Flask-Security для примера шаблонов по умолчанию..)

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

Создание шаблонов AUTH:

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

Настройте приложение с пользовательским автоответчиком:

import company_auth 
company_auth.init_app()