具有自定义安全性的Flask-Admin

时间:2017-12-01 19:37:10

标签: python flask-admin

我是Flask-Admin的新手,我能够将它实现到我的应用中。一切都很好。管理员视图已设置,可以显示和创建/删除数据。

当我寻找安全选项时,我发现我可以自己动手。但它显示了一个基于类的视图示例(我的是基于函数的)并且需要使用Flask-Login。我不想用它。我已经对必要的路径进行了授权检查,如下所示;

def login_required(something):
    @wraps(something)
    def wrap(*args, **kwargs):
        if 'logged_in' in session:
            return test(*args, **kwargs)
        else:
            return redirect(url_for('main.login'))

    return wrap


@main_blueprint.route('/')
@login_required
def index():
    form = MessageForm(request.form)
    return render_template('index.html', form=form)


@main_blueprint.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    form = LoginForm(request.form)

    if request.method == 'POST':
        if form.validate_on_submit():
            user = User.query.filter_by(name=request.form['name']).first()
            if user is not None and bcrypt.check_password_hash(user.password, request.form['password']):
                session['logged_in'] = True
                session['user_id'] = user.id
                session['role'] = user.role
                session['user'] = user.name
                flash('Welcome')

                return redirect(url_for('main.index'))
            else:
                error = 'Invalid Username or Password.'
                flash('Invalid Username/Password Combination')
    return render_template('login.html', form=form, error=error)

我试图做以下事情

@main_blueprint.route('/admin')
@login_required
def admin():
    return render_template('admin/master.html')

但显然这不起作用。

如何在不使用Flask-AdminFlask-Login或任何其他附加模块的情况下,将自己的安全性实施到Flask-Security路径?

1 个答案:

答案 0 :(得分:1)

我想我找到了答案。在https://danidee10.github.io/2016/11/14/flask-by-example-7.html的帮助下,我能够将其实施到我的应用中。

class AdminView(sqla.ModelView):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.static_folder = 'static'

    def is_accessible(self):
        return session.get('role') == 'admin'

    def inaccessible_callback(self, name, **kwargs):
        if not self.is_accessible():
            return redirect(url_for('main.login', next=request.url))

并将admin = Admin(app)更改为:

admin = Admin(app, name='Dashboard', index_view=AdminView(User, db.session, url='/admin', endpoint='admin'))