2017-01-19 4 views
2

Ich habe eine Flasche App auf Heroku, und ich muss eingehende IP-Adressen filtern. Ich habe keine Ahnung, wie ich das machen soll.IP Filterung in der Flasche

This answer schlägt vor, einen Wrapper zu verwenden, aber dies ist für private Routen - eingehende Anfragen nicht filtern. Die Hülle ist:

def private_only(route): 
    def wrapper(*args, **kwargs): 
     if IPy.IP(bottle.request.remote_addr).iptype() == 'PRIVATE': 
      return route(*args, **kwargs) 
     else: 
      return "Not allowed!" 
    return wrapper 

Würde Ändern der Wrapper:

def private_only(route): 
    def wrapper(*args, **kwargs): 
     if IPy.IP(bottle.request.remote_addr).iptype() in ALLOWED_IPS: 
      return route(*args, **kwargs) 
     else: 
      return "Not allowed!" 
    return wrapper 

und Dekorieren Routen mit:

@route('/my/internal/route') 
@private_only 
def my_view(): 
    return some_data() 

Arbeit?

Antwort

1

Wenn Sie die Filterung für die gesamte Flasche Anwendung aktivieren möchten, empfehle ich, stattdessen ein Plugin zu erstellen. Das folgende Beispiel sollte funktionieren:

from bottle import request 
from bottle import HTTPError 
from bottle import app 

class IPFilteringPlugin(object): 
    name = 'ipfiltering' 
    api = 2 

    def __init__(self, allowed_ips=[]): 
     self.allowed_ips = allowed_ips 

    def apply(self, callback, route): 
     def wrapper(*a, **ka): 
      if request.remote_addr in self.allowed_ips: 
       return callback(*a, **ka) 
      raise HTTPError("Permission denied", status=403) 
     return wrapper 

app.install(IPFilteringPlugin(["127.0.0.1", "10.0.2.15"]) 

Hinweis auch, dass Sie dieses Plugin nur pro Route nutzen können, indem sie sie in der @route Definition Angabe

filter_internal = IPFilteringPlugin(["127.0.0.1", "10.0.2.15"]) 
@route('/my/internal/route', apply=filter_internal) 
def internal_route(self): 
    pass 

# or directly route per route 
@route('/my/internal/route', apply=IPFilteringPlugin(["127.0.0.1", "10.0.2.15") 
def internal_route(self): 
    pass