如果我的唯一用户将成为管理员,如何保护 Flask-Admin?
How to secure Flask-Admin if my only user is going to be the Admin?
我在网上看到了很多解决方案,但它们都解决了允许外部用户创建帐户的更复杂的应用程序。在我的例子中,唯一的用户将是管理员。如何以有效的方式保护 Flask-Admin 创建的 /admin 路由?
您可以使用 Flask-Login。如果用户尚未登录,我通常会向 AdminIndexView class 添加一个路由来处理登录。否则将显示默认管理页面。
from flask import Flask
from flask_login import LoginManager
from flask_admin import Admin
app = Flask(__name__)
login_manager = LoginManager(app)
login_manager.session_protection = 'strong'
login_manager.login_view = 'admin.login'
admin = Admin(app, index_view=MyIndexView())
MyAdminView 的定义可以如下所示:
from flask_admin import AdminIndexView, expose, helpers
class FlaskyAdminIndexView(AdminIndexView):
@expose('/')
def index(self):
if not login.current_user.is_authenticated:
return redirect(url_for('.login'))
return super(MyAdminIndexView, self).index()
@expose('/login', methods=['GET', 'POST'])
def login(self):
form = LoginForm(request.form)
if helpers.validate_form_on_submit(form):
user = form.get_user()
if user is not None and user.verify_password(form.password.data):
login.login_user(user)
else:
flash('Invalid username or password.')
if login.current_user.is_authenticated:
return redirect(url_for('.index'))
self._template_args['form'] = form
return super(MyAdminIndexView, self).index()
@expose('/logout')
@login_required
def logout(self):
login.logout_user()
return redirect(url_for('.login'))
这在 Flask-Admin 界面中以不显眼的方式集成了 Flask-Login。您仍然需要像 Flask-Login documentation.
中描述的那样实施用户和密码验证
编辑
为防止未经授权访问您的管理路由,请使用以下代码创建一个 ModelView class for each view and add a function is_accessible()
:
def is_accessible(self):
if (not login.current_user.is_active or not
login.current_user.is_authenticated):
return False
return True
我在网上看到了很多解决方案,但它们都解决了允许外部用户创建帐户的更复杂的应用程序。在我的例子中,唯一的用户将是管理员。如何以有效的方式保护 Flask-Admin 创建的 /admin 路由?
您可以使用 Flask-Login。如果用户尚未登录,我通常会向 AdminIndexView class 添加一个路由来处理登录。否则将显示默认管理页面。
from flask import Flask
from flask_login import LoginManager
from flask_admin import Admin
app = Flask(__name__)
login_manager = LoginManager(app)
login_manager.session_protection = 'strong'
login_manager.login_view = 'admin.login'
admin = Admin(app, index_view=MyIndexView())
MyAdminView 的定义可以如下所示:
from flask_admin import AdminIndexView, expose, helpers
class FlaskyAdminIndexView(AdminIndexView):
@expose('/')
def index(self):
if not login.current_user.is_authenticated:
return redirect(url_for('.login'))
return super(MyAdminIndexView, self).index()
@expose('/login', methods=['GET', 'POST'])
def login(self):
form = LoginForm(request.form)
if helpers.validate_form_on_submit(form):
user = form.get_user()
if user is not None and user.verify_password(form.password.data):
login.login_user(user)
else:
flash('Invalid username or password.')
if login.current_user.is_authenticated:
return redirect(url_for('.index'))
self._template_args['form'] = form
return super(MyAdminIndexView, self).index()
@expose('/logout')
@login_required
def logout(self):
login.logout_user()
return redirect(url_for('.login'))
这在 Flask-Admin 界面中以不显眼的方式集成了 Flask-Login。您仍然需要像 Flask-Login documentation.
中描述的那样实施用户和密码验证编辑
为防止未经授权访问您的管理路由,请使用以下代码创建一个 ModelView class for each view and add a function is_accessible()
:
def is_accessible(self):
if (not login.current_user.is_active or not
login.current_user.is_authenticated):
return False
return True