Список Webapp2 (и/или уничтожение) всех сеансов для пользователя (Appengine Python)

Я работаю над приложением appengine, используя webapp2. Я основывал свою аутентификацию на идеях, изложенных в эту статью.

Я добавил возможность удалять учетную запись (это требование приложения), и у меня возникла проблема с сессиями. Если пользователь вошел в систему из более чем одного места, для этого пользователя будет два токена аутентификации. Когда учетная запись удаляется из одного из этих логинов, сеанс для этого логина уничтожается. Однако другой логин будет иметь токен аутентификации в хранилище данных.

Я изменил декоратор/функцию user_required/check_login, чтобы он сначала искал пользователя в сеансе. Если он не находит его, я сообщаю клиенту, что ему нужно войти в систему. Если он находит его, я получаю пользователя из хранилища данных. Если это None, то я предполагаю, что было несколько входов в систему, и другой удалил учетную запись (которая также удаляет пользователя). Поэтому я убиваю сеанс и говорю клиенту, что Пользователь больше не существует. В противном случае я проверяю, проверен ли пользователь, и если нет, я говорю клиенту, что пользователь должен быть проверен, прежде чем он сможет что-либо сделать.

Я предпочел бы убить все сеансы для пользователя, если учетная запись удалена. Есть какой-либо способ сделать это? Я также хотел бы эту функциональность, чтобы у меня была функция, с помощью которой вошедший в систему пользователь может видеть все сеансы для этого пользователя и убивать/отменять их по своему желанию (вроде того, что Facebook и Google, и я уверен, что много других услуг) предложение.

РЕДАКТИРОВАТЬ: Несмотря на то, что в какой-то момент я, вероятно, в конечном итоге получу пользователя из хранилища данных, и когда я вызываю self.user, это webapp2.cached_property, я все равно предпочел бы не иметь чтобы пользователь в начале каждого запроса был украшен user_required, если мне, возможно, удастся обойтись только извлечением информации из сеанса.


person Eliezer    schedule 26.08.2013    source источник
comment
Если вы проверяете сеанс пользователя при каждом запросе к хранилищу данных, то я думаю, что вы уже делаете все, что можете. Если вы на самом деле не спрашиваете, возможно ли удалить файлы cookie на компьютерах ваших пользователей, в этом случае это невозможно.   -  person dlebech    schedule 26.08.2013
comment
@dlebech Когда я говорю избавиться от сеанса, я имею в виду удалить его из хранилища данных, чтобы в следующий раз, когда пользователь попытается войти с этим логином, метод user_required сообщит, что для этого сеанса нет пользователя. Это было бы так, будь то из-за того, что пользователь удалил учетную запись, или из-за того, что пользователь отозвал этот сеанс (если бы я мог перечислить все текущие сеансы для этого пользователя и позволить пользователю отозвать/удалить сеанс (что означает получение избавиться от него в хранилище данных))   -  person Eliezer    schedule 26.08.2013
comment
Спасибо тебе за пояснение. В этом случае я думаю, что ответ от dragonx уместен.   -  person dlebech    schedule 27.08.2013


Ответы (1)


Похоже, вы используете серверную часть хранилища данных для сеансов.

Лучший способ, вероятно, изменить структуру сеанса, чтобы объект сеанса сохранял ваш идентификатор пользователя. Таким образом, вы можете запрашивать объекты сеанса по идентификатору пользователя, а затем удалять их и сбрасывать из кэша памяти.

В качестве альтернативы вы можете хранить свои сеансы в своей сущности пользователя, и когда вы удаляете пользователя, просмотрите этот список и избавьтесь от всех сеансов. Однако может быть немного сложно очистить истекающие сеансы из сущности пользователя.

person dragonx    schedule 26.08.2013
comment
Как мне изменить структуру сеанса? Будет ли это что-то вроде подкласса DatastoreSessionFactory? Вы также упомянули очистку истекающих сеансов. Должен ли я иметь задание cron, которое запускает каждый x и удаляет токены с истекшим сроком действия, или фреймворк обрабатывает это? - person Eliezer; 26.08.2013