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 回答