2012-08-04 131 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