До сих пор я использовал 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
Или есть лучший способ сделать это? (Извините, если это основной вопрос, я никогда не делал этого раньше)
Спасибо, всего лишь: как я должен выйти из функции, если условия не выполнены (извините, я никогда не перезаписывал способ отправки). Это что-то вроде: если не условие: self.error (401)? –
Nevermind, я уже нашел, как использовать отправку. Большое спасибо, он работает точно так, как ожидалось. –
Да, вы можете использовать: webapp2.abort (code) – voscausa