2012-08-04 133 views
9

认证和授权可以通过烧瓶登录瓶校长插件集成到烧瓶中。 (或者也可能通过烧瓶安全插件。)烧瓶管理员+(烧瓶-登录和/或瓶校长)

但是:烧瓶联系 --another插件,它提供了一个后端仪表板 - 不是已注册的蓝图......而且,我相信(之多,因而我可以告诉),Flask-Login和Flask-Principal使用的装饰器,以及用户访问渲染视图所需的装饰器......这些装饰器仅对作为已注册蓝图一部分的视图进行操作。

两个问题:

1)如何注册烧瓶管理员在我的应用程序的蓝图,和/或以其他方式使烧瓶登录和/或瓶校长装饰保护与烧瓶联系相关意见?

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

我收集这些insomuch是问题,因为它是无汗为我创造了我的应用程序的主索引页保护的观点......或任何其他页面与位于蓝图内的视图。我似乎无法做到Flask-Admin索引页面(它再次没有蓝图)。

回答

11

烧瓶管理员提供提供身份验证的另一种方式 - 您只需子类AdminIndexBaseIndex意见(从contrib或观点,如果你只需要那些),并实现is_accessible方法。有关更多详细信息,请参见the documentation。版本库中还提供an example

+0

感谢,肖恩...用于车削我到文档的这一个。我已经对它们进行了审查,并试图实施它们......尽管无济于事。那么使用is_accessible方法就不必使用Flask-Login来保护管理仪表板?含义:那么我不需要Flask-Login装饰器来定义任何Flask-Admin视图?我不得不说,在回购之外,这个文档对于Flask-Admin的身份验证很薄弱。偶然的情况下,如果超出上述回购协议,您会遇到另一个公共解决方案......想知道这个解决方案。 – Sean 2012-08-13 06:48:25

+1

@Sean - 您不需要Flask-Login *装饰器*,但您需要使用Flask-Login方法来验证用户身份。如果您查看[第85行](https://github.com/mrjoes/flask-admin/blob/master/examples/auth/auth.py#L85)并且超出范例,您会看到管理视图只有当前用户通过身份验证时才可以访问。如果未经身份验证的用户尝试访问管理视图,则应将其重定向到登录屏幕。 – 2012-08-13 12:19:18

+0

示例的链接正是我所需要的,谢谢。 – iurii 2014-07-02 07:16:04

4

简单的例子如何使用烧瓶管理与瓶校长

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) 
+1

返回'is_accessible'中的重定向被评估为True。这绝对不是你想要的! – Javier 2015-06-10 01:29:42