2010-07-21 21 views
6

Kirazlı bir uygulamam var ve bazı görüntülerde yalnızca belirli kullanıcıların bunları görüntülemesine izin vermek ve herhangi bir başkasına yetkilendirme gerekli sayfaya göndermek istiyorum.Yetkilendirme için bir CherryPy Dekoratörlüğü Yazma

Bunu özel bir dekoratör ile yapabileceğim bir yol var mı? Bence en zarif seçenek bu olurdu.

class MyApp: 
    @authorization_required 
    def view_page1(self,appID): 
     ... do some stuff ... 
     return html 

def authorization_required(func): 
    #what do I put here? 

Ayrıca dekoratör olarak adlandırılan authorization_required fonksiyon allow_group1, allow_group2 gibi parametreleri kabul edebilir:

İşte yapmak istediğim temel bir örnek? Ya da her grup için ayrı bir dekoratöre ihtiyacım var mı?

+0

Tüm bunlar mümkündür, ancak ne tür bir kimlik doğrulama sistemi kullanıyorsunuz. Ya da kullanmayı planlıyor musunuz? CherryPy'de birkaç kimlik doğrulama yöntemi vardır: http://www.cherrypy.org/wiki/BuiltinTools – Wolph

+0

Yerleşik bir şey kullanmak istediğimi sanmıyorum. Karşılaştığımız bazı özel veri depolarımız var, vb. – Greg

cevap

4

Tamam, bu durumda sizin dekoratör böyle bir şey görünecektir:

# without any parameters 
def authentication_required(f): 
    @functools.wraps(f) 
    def _authentication_required(*args, **kwargs): 
     # Do you login stuff here 
     return f(*args, **kwargs) 
    return _authentication_required 

# With parameters 
def authentication_required(*allowed_groups): 
    def _authentication_required(f): 
     @functools.wraps(f) 
     def __authentication_required(*args, **kwargs): 
      # Do you login stuff here 
      return f(*args, **kwargs) 
     return __authentication_required 
    return _authentication_required 
+2

@ functools.wraps ne yapar? Bu vişne içine mi kurulu? – Greg

+0

Ayrıca, ben sadece giriş şeyleri başarılı olduğunda f (* args, ** kwargs) döndürürüm? Öte yandan kullanıcı yetkilendirilmemişse, geri dönmek yerine cherry.redirect'i arar mıyım? – Greg

+0

Evet, doğru. Ve 'functools.wraps', dekoratörler yazarken işlev adının, belgelerin ve diğer verilerin otomatik olarak kopyalanmasını sağlayan bir yöntemdir. Bu şekilde, dekore edilmiş bir yöntemde 'help (method)' yaparsanız, yine de orijinalleri docs elde edersiniz. – Wolph

13

Gerçekten CherryPy'ın için özel dekoratörler yazma olmak istemiyoruz. Bunun yerine, yeni bir Aracı yazmak istiyorum:

def myauth(allowed_groups=None, debug=False): 
    # Do your auth here... 
    authlib.auth(...) 
cherrypy.tools.myauth = cherrypy.Tool("on_start_resource", myauth) 

daha tartışmaya http://docs.cherrypy.org/en/latest/extend.html#tools bakınız. Bu, özel bir dekoratör üzerine yazmaktan birçok faydası vardır:

  1. Sen Aracı ücretsiz dekoratör olsun: @cherrypy.tools.myauth(allowed_groups=['me']) ve zaten aynı fonksiyonu üzerine cherrypy.exposed zarar vermiyorum bilir.
  2. Araçlar'ı, her bir denetimciye (dekoratörle), denetleyici ağacına (_cp_config aracılığıyla) veya URI ağacına (yapılandırma dosyalarında veya dicts) uygulayabilirsiniz. Hatta bunları karıştırabilir ve dekoratörler aracılığıyla bir temel özellik sağlayabilir ve daha sonra yapılandırma dosyalarındaki davranışlarını geçersiz kılabilirsiniz.
  3. Bir yapılandırma dosyası, özelliğinizi kapatırsa, yalnızca kapalı olup olmadığını görmek için dekoratör işlevini çağırmanın performans cezasını ödemezsiniz.
  4. Tüm yerleşik Araçlar'ın sahip olduğu gibi bir 'hata ayıklama' argümünü eklemeyi unutmayın. ;)
  5. Özelliğiniz, özel bir dekoratörün farklı bir "nokta" seçerek daha önce (veya daha sonra ihtiyaç duyduğunuz buysa) çalışabilir.
  6. Özelliğiniz, gerekirse çoklu kanca noktalarında çalışabilir.
+0

Bu kod benim için çalışıp çalışmadığından emin değilim çünkü bu kod RouteDispatcher'ı (yerine?) Açığa çıkarıcıyı kullanıyor. Neden böyle yapıldığından emin değilim. – Greg

+0

Kullandığınız dağıtıcı gerçekten bir sorun değil: tuzuna (herhangi bir Rota dahil) sahip herhangi bir dağıtım aracı Araçlar ile çalışacaktır. Gösteri düzenleyicisi, 'method.exposed = True' ayarlanmış olduğundan başka bir şey yapmaz. Yine, tüm dağıtım memurları için bu gereklidir ve Araçlar'ın işe yarayıp yaramadığına dair bir dayanağı yoktur. Onu atın ağzından alın: Araçlar CherryPy'de bunu yapmanın yolu. – fumanchu

+0

Kod pasajı nasıl sağlanır? –