【问题标题】:How to prevent users from accessing Admin Page?如何阻止用户访问管理页面?
【发布时间】:2016-12-18 23:51:37
【问题描述】:

我想阻止用户访问管理 url,我已经保护了视图但 /admin/ 仍然可以访问。

admin.py

import os

from flask import request, redirect, url_for
from werkzeug import secure_filename

from flask_admin import Admin, AdminIndexView
from flask_admin import BaseView, expose
from flask_admin.contrib.sqla import ModelView
from flask_admin.contrib.fileadmin import FileAdmin

from flask_login import current_user,login_required

from develop.extentions import admin_permission

from wtforms import FileField

class AdminIndex(AdminIndexView):
    @expose('/admin/')
    def index(self):
        if not current_user.is_authenticated:
            return redirect(url_for('main.index'))
        return self.render('admin/home.html')

    def is_accessible(self):
        return current_user.roles('admin')

class CustomModelView(ModelView):
    def is_accessible(self):
        return current_user.is_authenticated and admin_permission.can
    def inaccessible_callback(self, name, **kwargs):
        return redirect(url_for('main.index', next=request.url))

class CustomFileView(FileAdmin):

    allowed_extensions = (
        'txt',
        'md',
        'js',
        'css',
        'html',
        'jpg',
        'gif',
        'png'
    )

    editable_extensions = ('md','html','js','css','txt')

    def is_accessible(self):
        return current_user.is_authenticated and admin_permission.can

class UserView(CustomModelView):
    column_list = ('username', 'confirmed','joined')

    column_searchable_list = ('username', 'id')
    column_filters = ('joined', 'email', 'username')

    path = os.path.abspath(
        os.path.join(
            os.path.dirname(__file__),
            os.pardir
        )
    )

    form_extra_fields = {
        "image": FileField('Image')
    }

    def on_model_change(self, form, model, is_created):
        path = os.path.abspath(
            os.path.join(
                os.path.dirname(__file__),
                os.pardir
            )
        )

        image_path = os.path.join(path, 'static', 'images')
        photo_data = request.files.get(form.image.name)

        if photo_data:
            name = secure_filename(photo_data.filename)
            model.image = '/static/images/' + name
            photo_data.save(os.path.join(image_path, name))

通过这种方式,我所有的其他视图都被隐藏了,但我仍然访问管理页面,请问如何防止未经身份验证的用户甚至访问 admin

【问题讨论】:

  • 在阅读您的代码和您对@MrLeeh 回答的评论后,我不清楚您尝试使用该代码是否包括@expose('/')。您上面的代码不包含它。如果您不装饰索引方法,我假设父类 (flask_admin.AdminIndexView.index) 中的索引方法仍在为您的 /admin/ 端点提供服务。
  • 代码已更新!
  • 鉴于上面的代码使用了@expose('/admin/'),还不清楚您是否尝试过使用@expose('/')? Flask-admin 已经将/admin/ 添加到这些端点,所以我认为您上面的装饰器将为/admin/admin/ 提供服务。

标签: flask flask-admin


【解决方案1】:

index 函数中处理您的身份验证检查,如果未通过身份验证,则进行重定向。

@expose('/')
def index(self):
    if not current_user.is_authenticated:
        return redirect(url_for('main.index'))
    return self.render('admin/home.html')

【讨论】:

  • 我试过你的代码,但没有 val,它仍然可以访问,我将提供 admin.py 代码,这样会更清楚。
  • 正如@abathur 所说:您需要使用@expose('/'),而不是@expose('/admin/') 才能工作。
猜你喜欢
  • 2016-09-19
  • 2020-09-01
  • 2014-04-06
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2016-04-11
  • 2019-02-02
相关资源
最近更新 更多