Flask-basicAuth身份验证所需的Flask-Admin视图修饰器

时间:2019-02-22 20:23:13

标签: python flask flask-admin

我目前正在使用Flask制作一个后端应用程序,以管理资源以供基于组织的用户使用。

由于我使用的是Flask-SQLAlchemy,所以我决定将Flask-Admin用于数据库的管理员视图,但是在保护视图时遇到了问题。

我试图使用Flask-BasicAuth只是为了保护管理员视图,但是由于路由是自动生成的,因此无法向其中添加@ basic-auth.required装饰器。 强制网站使用Flask-BasicAuth会阻塞资源端点,因此不是一个好的解决方案。

尝试了类似的方法,但是它不起作用:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from flask_basicauth import BasicAuth

app = Flask(__name__)
db = SQLAlchemy(app)
basic_auth = BasicAuth(app)
admin = Admin(app)

class Module(db.Model):
  __tablename__='Modules'
  name = db.Column(db.String(30), unique=True, nullable=False)

@basic_auth.required
class AdminView(ModelView):
  pass

admin.add_view(AdminView(Module, db.session))

TL; DR:Flask Admin假定我使用登录和会话管理器。 Flask BasicAuth假定我可以手动声明路由。需要以某种方式集成它们,而不会阻塞资源端点。

2 个答案:

答案 0 :(得分:0)

在实施它时,我遇到了同样的问题。 @ basic_auth.required装饰器将无法使用。相反,我们必须调整flask_admin的几个类以使其与BasicAuth兼容。引用了数十个资源之后,这就是我成功实现它的方法!

仅提及我正在使用的: Python 3.6.9,Flask == 1.1.1,Flask-Admin == 1.5.4,Flask-BasicAuth == 0.2.0

sealed abstract class Cache(tablePostfix: String, ttl: Int) {
  val tableName = s"baseTableName_$tablePostfix"
}
case object OpsCache extends Cache("ops", 60)
case object SnapshotCache extends Cache("snaps", 120)
case object MetadataCache extends Cache("metadata", 180)

OpsCache.tableName // res0: String = baseTableName_ops

答案 1 :(得分:0)

official documentation说,没有简单的方法可以仅在您的管理页面上实现它。但是,我找到了一种解决方法。您可能需要修改flask中的一些现有类,以使其与基本身份验证兼容。将它们添加到您的代码。 Fyi,您将需要从flask导入Response。

class ModelView(sqla.ModelView):
    def is_accessible(self):
        if not basic_auth.authenticate():
            raise AuthException('Not authenticated.')
        else:
            return True

    def inaccessible_callback(self, name, **kwargs):
    return redirect(basic_auth.challenge())
from werkzeug.exceptions import HTTPException


class AuthException(HTTPException):
    def __init__(self, message):
        super().__init__(message, Response(
            "You could not be authenticated. Please refresh the page.", 401,
            {'WWW-Authenticate': 'Basic realm="Login Required"'}
        ))

然后通常像这样添加管理员视图

admin = Admin(app)
admin.add_view(ModelView(Module, db.session))
相关问题