gpt4 book ai didi

security - 如何使用 Flask-security 保护 Flask-admin 面板

转载 作者:行者123 更新时间:2023-12-02 15:28:20 29 4
gpt4 key购买 nike

我正在寻找使用 Flask 制作并与 flask-admin 集成的安全 Web API提供管理界面。我搜索并发现flask-admin有一个管理面板在/admin默认情况下任何人都可以访问它。它不提供身份验证系统并且完全开放(没有任何安全性),因为他们没有假设将使用什么来提供安全性。这个API必须在生产中使用,所以我们不能开放/admin每个点击该网址的人的路线。需要适当的身份验证。

views.py我不能简单地输入 /admin路由并通过装饰器提供身份验证,因为这将覆盖 flask-admin 已创建的现有路由这样会导致错误。

进一步研究表明有两个模块flask-adminflask-security 。我知道flask-adminis_accessible方法来保护它,但它没有提供 flask-security 提供的太多功能。 .

我没有找到任何方法来保护端点 /admin加上以 /admin 开头的所有其他端点如/admin/<something> .

我正在专门寻找使用 flask 安全来完成这项任务。如果不可能,请提出替代方案。

PS:我知道我可以锁定ngnix本身,但这将是最后的选择。如果我可以通过 flask-security 有一个认证系统那就好了。

最佳答案

由于这是“flask-security secure admin”谷歌搜索的第一个结果,并且还没有现成的解决方案,所以我想我可以做出贡献。

在flask-admin项目Issue List上提出了类似的问题,并提供了一个使用flask-login和mogodb的简单示例here

我使用 SQLAchemy 为 sqlite 数据库和 Flask-security 制作了一个示例。请参阅下面的示例 flask 应用程序:

 #!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import os.path as op
from flask import Flask, render_template, url_for, request
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.event import listens_for
from flask.ext.security import current_user, login_required, RoleMixin, Security, SQLAlchemyUserDatastore, UserMixin
from flask_admin import Admin, AdminIndexView
from flask_admin.contrib import sqla

# Create application
app = Flask(__name__)

# Create dummy secrety key so we can use sessions
app.config['SECRET_KEY'] = '123456790'

# Create in-memory database
app.config['DATABASE_FILE'] = 'sample_db.sqlite'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE']
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)

# Create directory for file fields to use
file_path = op.join(op.dirname(__file__), 'static/files')

# flask-security models

roles_users = db.Table('roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))

class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))

class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))

# Create Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)

# Only needed on first execution to create first user
#@app.before_first_request
#def create_user():
# db.create_all()
# user_datastore.create_user(email='yourmail@mail.com', password='pass')
# db.session.commit()

class AnyModel(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(64))

def __unicode__(self):
return self.name

class MyAdminIndexView(AdminIndexView):
def is_accessible(self):
return current_user.is_authenticated() # This does the trick rendering the view only if the user is authenticated

# Create admin. In this block you pass your custom admin index view to your admin area
admin = Admin(app, 'Admin Area', template_mode='bootstrap3', index_view=MyAdminIndexView())


# Add views
admin.add_view(sqla.ModelView(AnyModel, db.session))

# To acess the logout just type the route /logout on browser. That redirects you to the index
@login_required
@app.route('/login')
def login():
return redirect('/admin')

@app.route('/')
def index():
return render_template('index.html')


if __name__ == '__main__':

# Build sample db on the fly, if one does not exist yet.
db.create_all()
app.run(debug=True)

请参阅flask-security文档来了解how to customize the login page

希望这有帮助。

关于security - 如何使用 Flask-security 保护 Flask-admin 面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31091637/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com