具有自定义安全性的 Flask-Admin
Flask-Admin with Custom Security
我是 Flask-Admin 的新手,我能够将它实现到我的应用程序中。一切正常。管理员视图已设置,它们可以显示和 create/delete 数据。
当我寻找安全选项时,我看到我可以自己滚动。但它显示了一个基于 class 的视图示例(我的是基于函数的)并且需要使用 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-Login
或 Flask-Security
或任何其他附加模块的情况下对 Flask-Admin
路径实施我自己的安全性?
我想我找到了答案。在 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'))
我是 Flask-Admin 的新手,我能够将它实现到我的应用程序中。一切正常。管理员视图已设置,它们可以显示和 create/delete 数据。
当我寻找安全选项时,我看到我可以自己滚动。但它显示了一个基于 class 的视图示例(我的是基于函数的)并且需要使用 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-Login
或 Flask-Security
或任何其他附加模块的情况下对 Flask-Admin
路径实施我自己的安全性?
我想我找到了答案。在 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'))