2017-01-19 2 views
2

J'ai une application Bottle sur heroku, et j'ai besoin de filtrer les adresses IP entrantes. Je ne sais pas trop comment faire ça.Filtrage IP en bouteille

This answer suggère d'utiliser un wrapper, mais c'est pour les routes privées - ne filtrant pas les demandes entrantes. L'emballage est:

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 

Est-ce que changer l'emballage à:

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 

et itinéraires de décoration avec:

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

travail?

Répondre

1

Si vous souhaitez activer le filtrage pour l'ensemble de l'application bouteille, je suggère de créer un plugin à la place. L'exemple ci-dessous devrait fonctionner:

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"]) 

Notez également que vous pouvez utiliser ce plugin seulement par trajet, en spécifiant dans la définition @route

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