【问题标题】:Flask-Admin & Authentication: "/admin" is protected but "/admin/anything-else" is notFlask-Admin & Authentication:“/admin”受保护,但“/admin/anything-else”不受保护
【发布时间】:2013-07-09 03:02:48
【问题描述】:

我正在尝试使用 Flask 和 Flask-SuperAdmin 自定义我的管理视图,但是,索引视图和子视图显然没有使用相同的 is_accessible 方法:

编辑:我设法弄清楚我做错了什么。我需要在每个视图类中定义 is_accessible。这可以通过 mixin-class 很好地完成,如固定代码所示:

app/frontend/admin.py(固定和工作代码

from flask.ext.security import current_user, login_required
from flask.ext.superadmin import expose, AdminIndexView
from flask.ext.superadmin.model.base import ModelAdmin
from ..core import db

# all admin views should subclass AuthMixin
class AuthMixin(object):
    def is_accessible(self):
        if current_user.is_authenticated() and current_user.has_role('Admin'):
            return True
        return False

# the view that gets used for the admin home page
class AdminIndex(AuthMixin, AdminIndexView):
    # use a custom template for the admin home page
    @expose('/')
    def index(self):
        return self.render('admin/index.jade')

# base view for all other admin pages
class AdminBase(AuthMixin, ModelAdmin): # AuthMixin must come before ModelAdmin!
    """A base class for customizing admin views using our DB connection."""
    session = db.session

# customize the form displays for User and Role models

class UserAdmin(AdminBase):
    list_display = ('email',)
    search_fields = ('email',)
    exclude = ['password',]
    #fields_order = ['email', 'active', 'last_login_at',]

class RoleAdmin(AdminBase):
    field_args = {'name': {'label': 'Role Name'},
                'description': {'description': "Duties & Responsibilities"}}
    list_display = ('name', 'description')

然后使用我们的管理员视图设置 Flask 应用程序:
应用程序/factory.py

app = Flask(package_name, instance_relative_config=True)
# other app setup stuff like db, mail, ...

from .frontend.admin import AdminIndex, UserAdmin, RoleAdmin
admin = Admin(app, name='PyCBM Admin',
              index_view=AdminIndex(url='/admin', name='Admin Home'))
admin.register(User, UserAdmin)
admin.register(Role, RoleAdmin)

所以,正如标题所说,问题出在:

/admin throws a 403 when an 'Admin' user isn't logged in, like it should, but
/admin/user lets anybody right on in.

我翻遍了源代码,试图找到另一个“全局全管理员蓝图”安全功能——也许我是个盲人——但我找不到。

【问题讨论】:

  • 你应该回答你自己的问题以将其标记为已解决
  • 这实际上不是flask-admin,这是flask-superadmin

标签: python flask flask-login flask-security flask-admin


【解决方案1】:

如果你去flask_superadmin/base.py,在第193行有以下代码sn-p:

def _handle_view(self, name, *args, **kwargs):
    if not self.is_accessible():
        return abort(403)

所以也许这个方法必须被AdminIndex 覆盖以避免返回abort(403) 而是重定向到/login

【讨论】:

  • @app.errorhandler(403) def page_forbiden(e): return redirect(url_for_security("login"))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多