可以通过 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索引页面执行此操作(同样,它没有蓝图)。
答案 0 :(得分:11)
Flask-Admin提供了另一种提供身份验证的方法 - 您只需将AdminIndex
和BaseIndex
视图(或来自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)
此repository是flask-login和flask-security如何与flask-admin连接的一个很好的例子。
在this reddit post中,样板作者简短描述了实现逻辑。