Flask-Admin +(Flask-Login和/或Flask-Principal)

时间:2012-08-04 00:30:55

标签: python plugins import flask

可以通过 Flask-Login Flask-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索引页面执行此操作(同样,它没有蓝图)。

3 个答案:

答案 0 :(得分:11)

Flask-Admin提供了另一种提供身份验证的方法 - 您只需将AdminIndexBaseIndex视图(或来自contrib的视图)子类化(如果您只需要这些视图)并实现{{1 }} 方法。有关详细信息,请参阅the documentation。存储库中还提供了an example

答案 1 :(得分: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)

答案 2 :(得分:0)

repositoryflask-loginflask-security如何与flask-admin连接的一个很好的例子。

this reddit post中,样板作者简短描述了实现逻辑。