2

当社のユーザーサーバーに基づいてユーザーを認証するクラスを作成しました。各プロジェクトでコードを繰り返すのではなく、Flask-Login を使用する Flask アプリに適用したいと思います。これの正しいパターンが何であるか、またはそれを実装する方法がわかりません。

私はいくつかのオプションを考えました:

  1. Python モジュール - 単純な認証。モジュールはログインを行い、何か (認証情報やトークンなど) を返します。
  2. Flask 'app' - 認証し、ログインおよびログアウト画面を含め、何らかの形で@login_manager.user_loader. 私が見る問題は、読み込まれたユーザーが任意のアプリケーションのユーザー スキーマを持つ可能性があることです。

この共通の認証を複数のプロジェクトに実装するための適切なパターンは何ですか?

4

1 に答える 1

4

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='davidism@gmail.com',
    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()
于 2015-08-11T21:05:01.107 に答える