0

До сих пор я использовал oauth2 для управления аутентификацией с помощью учетных записей Google для своего приложения, что дает мне некоторые данные для заполнения базового профиля. Проблема в том, что теперь я хочу управлять разрешениями для просмотра и редактирования большого количества контента в приложении, причем разные группы людей могут просматривать/редактировать разные части приложения.Как управлять авторизацией в GAE с помощью учетных записей Google?

Я хочу, чтобы некоторые части моего приложения были доступны пользователям с разрешением для A, некоторые для B, C и т. Д. Как я начал это делать, использовался декоратор в методе get и post каждого обработчика, например это:

class SomeHandler(Handler): 
    @validate_access 
    def get(self): 
     pass 

    @validate_access 
    def post(self): 
     pass 

Где @validate_access выполняет код в функции, только если пользователь имеет разрешение на него, и возвращает ошибку авторизации, если нет. Это казалось хорошим решением некоторое время назад, но поскольку есть много обработчиков, я должен использовать этот декоратор повсюду, что раздражает и опасно, так как я могу забыть включить его в некоторые функции.

Есть ли способ поставить эти проверки в инициализацию базового обработчика, чтобы мне не пришлось использовать этот декоратор повсюду? Я представляю что-то вроде этого:

class BaseHandler(webapp2.RequestHandler): 

def initialize(self, request, response): 
    super(Handler, self).initialize(request, response) 

    self.user = users.get_current_user() 
    employee = Employee.query(user_id=self.user.user_id).get() 

    if employee.auth_level > 3: 
     #See the content: Do whatever the "get" method of the corresponding handler does. 
     pass 
    else: 
     #Raise authorization error 
     pass 

Или есть лучший способ сделать это? (Извините, если это основной вопрос, я никогда не делал этого раньше)

ответ

1

Да, вы можете перезаписать обработчик отправки webapp2 для этой цели. Я использовал этот метод для обеспечения контроля доступа на основе ролей (RBAC).

Пример кода:

class BaseHandler(webapp2.RequestHandler): 
    """ webapp2 base handler """ 

    def dispatch(self): 

     # UserAccess aborts if the user does not have permission to use a handler 
     UserAccess(self.request) 
     super(BaseHandler, self).dispatch() 
     .... 


class ExampleHandler(BaseHandler): 

    def get(self): 

     ..... 

Я использую конфигурационный файл с разрешенными ролями для обработчика. Этот файл также используется для создания маршрутов webapp2 и динамического пользовательского меню.

+0

Спасибо, всего лишь: как я должен выйти из функции, если условия не выполнены (извините, я никогда не перезаписывал способ отправки). Это что-то вроде: если не условие: self.error (401)? –

+0

Nevermind, я уже нашел, как использовать отправку. Большое спасибо, он работает точно так, как ожидалось. –

+0

Да, вы можете использовать: webapp2.abort (code) – voscausa