如果我的唯一用户将成为管理员,如何保护Flask-Admin?

时间:2017-03-05 16:13:52

标签: flask flask-admin flask-security

我在网上看到了很多解决方案,但是所有解决方案都解决了更复杂的应用程序,允许外部用户创建帐户。在我的情况下,唯一的用户将是管理员。如何以有效的方式保护Flask-Admin创建的/ admin路由?

1 个答案:

答案 0 :(得分:2)

您可以使用Flask-Login。我通常会添加一个到AdminIndexView类的路由,如果用户还没有登录,它将处理登录。否则,将显示默认管理页面。

var store = new Vuex.Store({
  state: {
    value: 1,
    quote: {
      items: [],
      something: ''
    }
  },
  mutations: {
    ADD (state, item) {
      state.quote.items.push(item)
    }
  }
})

MyAdminView的定义如下所示:

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())

这在Flask-Admin界面中不显眼地集成了Flask-Login。您仍需要执行Flask-Login documentation

中所述的用户和密码验证

修改

为防止未经授权访问您的管理路由,请为每个视图创建一个ModelView类,并使用以下代码添加函数is_accessible()

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'))