11

身份验证和授权可以通过Flask-LoginFlask-Principal插件集成到 Flask 中。(或者也可能通过 Flask-Security 插件。)

但是:Flask- Admin——另一个提供后端仪表板的插件——不是注册的蓝图……而且,我相信(据我所知),Flask-Login 和 Flask-Principal 使用的装饰器——和否则用户访问渲染视图所必需的......这些装饰器仅对作为注册蓝图一部分的视图进行操作。

两个问题:

1) 如何在我的应用程序中将 Flask-Admin 注册为蓝图,和/或启用 Flask-Login 和/或 Flask-Principal 装饰器来保护与 Flask-Admin 关联的视图?

2) 为什么 Flask-Login 和 Flask-Principal 仅适用于我的应用程序“本机”一部分的对象......而不是从插件导入的对象(例如,“Admin”对象)?我该如何解决这个问题......如果我确实正确地感知它?

我认为这是问题所在,因为我可以毫不费力地为我的应用程序的主索引页面创建受保护的视图......或任何其他具有位于蓝图中的视图的页面。我似乎无法为 Flask-Admin 索引页面(同样没有蓝图)这样做。

4

3 回答 3

11

Flask-Admin 提供了另一种提供身份验证的方式 - 您只需子类化AdminIndexBaseIndex视图(或视图,contrib如果您只需要它们)并实现该is_accessible方法。有关更多详细信息,请参阅文档。存储库中还提供了一个示例。

于 2012-08-04T01:38:36.803 回答
4

如何将 Flask-Admin 与 Flask-Principal 一起使用的简单示例

from functools import partial
from flask.ext.admin import Admin as BaseAdmin, AdminIndexView
from flask.ext.principal import Permission, identity_loaded, Need
from flask.ext.security import current_user

PartnerAccessNeed = partial(Need, 'access')

class PartnerAccessPermission(Permission):
    def __init__(self, partner_id):
        need = PartnerAccessNeed(partner_id)
        super(PartnerAccessPermission, self).__init__(need)


@identity_loaded.connect
def on_post_identity_loaded(sender, identity):  
    if hasattr(current_user, 'partner'):
        identity.provides.add(PartnerAccessNeed(current_user.partner.id))

class PartnerAdminIndexView(AdminIndexView):

    def __init__(self, partner_id, *args, **kwargs):
        self.partner_id = partner_id
        super(PartnerAdminIndexView, self).__init__(*args, **kwargs)

    def is_accessible(self):

        if current_user.is_anonymous():
            return redirect(url_for_security('login'))

        if not current_user.is_partner():
            return False

        permission = PartnerAccessPermission(self.partner_id)

        if permission.can():    
            return True

        return False

class PartnerAdmin(BaseAdmin):
    def __init__(self, partner_id, endpoint, name, subdomain, *args, **kwargs):

        index = PartnerAdminIndexView(name=name, 
                                      endpoint=endpoint,
                                      url='/dashboard',
                                      partner_id=partner_id)

        super(PartnerAdmin, self).__init__(base_template='mcnm/master.html', index_view=index, subdomain=subdomain)
于 2014-01-07T19:11:08.423 回答
0

这个存储库是一个很好的例子,说明了flask-loginflask-security如何与 flask-admin 连接。

这篇 reddit 帖子中,样板的作者简要描述了实现逻辑。

于 2018-07-16T22:56:54.380 回答