2009-09-30 3 views
0

В этом посте, Ник предложил decoartor:Python Decorator для GAE веб-службы безопасности Проверка

Python/WebApp Google App Engine - testing for user/pass in the headers

Я пишу API, чтобы выставить потенциально десятки способов, как веб-сервисов, поэтому декоратор Звучит как отличная идея.

Я попытался начать кодирование один на основе этого образца: http://groups.google.com/group/google-appengine/browse_thread/thread/ac51cc32196d62f8/aa6ccd47f217cb9a?lnk=gst&q=timeout#aa6ccd47f217cb9a

мне нужен совместимый с Python 2.5 для запуска в Google App Engine (GAE).

Вот моя попытка. Пожалуйста, просто укажите путь, если я на правильном пути или нет. В настоящее время получаю ошибку «Неверный синтаксис» на этой линии: класс WSTest (webapp.RequestHandler):

Моя идея заключается в том, чтобы передать массив ролей декоратора. Это единственные роли (из моего db, которые должны иметь доступ к каждому веб-сервису).

def BasicAuthentication(roles=[]): 
    def _decorator(func): 
    def _wrapper(*args, **kwds): 
     logging.info("\n\n BasicAuthentication:START:__call__ \n\n") 
     auth = None 
     if 'Authorization' in self.request.headers: 
      auth = self.request.headers['Authorization'] 
     if not auth: 
      self.response.headers['WWW-Authenticate'] = 'Basic realm="MYREALM"' 
      self.response.set_status(401) 
      self.response.out.write("Authorization required") 
      logging.info ("\n\n Authorization required \n\n") 
      return 

     (username, password) = base64.b64decode(auth.split(' ')[1]).split(':') 
     logging.info ("\n\n username = " + username + " password=" + password + "\n\n")   

     isValidUserPass = False 
     usersSimulatedRole = "Admin" 
     #check against database here... 
     if user == "test12" and password == "test34": 
      isValidUserPass = True 
     isValidRole = False 
     if usersSimulatedRole in roles: 
      isValidRole = True 
     #next check that user has one of the roles 
     # TODO 

     if not isValidUserPass: 
      self.response.set_status(403) 
      self.response.out.write("Forbidden: Userid/password combination failed") 

     logging.info("\n\n BasicAuthentication:END:__call__ \n\n") 
     return func(*args, **kwds) 
    return _wrapper 
    return _decorator 


@BasicAuthentication(["Admin","Worker"]) #list of roles that can run this function 
class WSTest(webapp.RequestHandler): 
    def get(self): 
    logging.info("\n\n\n WSTest \n\n") 
    ...etc... 

Благодаря, Нил Walters

+0

У меня есть вопрос, который не имеет отношения. Используете ли вы управление сеансом для роли пользователя при входе пользователя в систему? Если нет, то как вы запрещаете пользователям, прошедшим проверку подлинности, но не имея правильной роли от доступа к странице после входа в систему (при условии, что они могут войти в другую часть сайта под другой ролью)? –

ответ

2

Вам необходимо написать декоратор методов, а не декоратор класса. Как указано в теории потерь, декораторы класса не существуют в Python 2.5, и в любом случае они не будут работать очень хорошо, потому что класс RequestHandler не инициализируется данными запроса до после. Оформление метода также дает вам больше контроля - например, вы можете разрешить GET-запросы, не прошедшие проверку подлинности, но все равно требующие аутентификации для запросов POST.

Помимо этого, ваш декоратор отлично выглядит - примените его только к соответствующим методам. Единственное изменение, которое я действительно предлагаю, заключается в замене вызовов .set_status() вызовами .error() и удалении вызовов response.write; это позволяет вам переопределить .error() в классе RequestHandler для вывода хорошей страницы ошибки для каждого возможного кода состояния.

2

декораторов класса были добавлены в Python 2.6.

Вам придется вручную обернуть класс или подумать о другом решении для работы под 2.5. Как насчет написания декоратора для метода get?

+0

Или просто 'get' вызывать функцию или метод базового класса для выполнения авторизации или использовать промежуточное программное обеспечение? Я действительно не вижу, какое большое преимущество декораторов для этого прецедента. – bobince

+0

Да, эти хорошие варианты. Мне нравятся декораторы, потому что это хороший декларативный синтаксис (легко читаемый) для аннотирования функций/классов с дополнительным поведением ... Но есть много стратегий, которые дают тот же результат. –

Смежные вопросы