Я искал чистый, надежный способ сохранения текущего пользователя в приложении Android, которое доступно из любого действия / представления, доступно немедленно и может быть надежно очищено при выходе из системы.
Чтобы добавить дополнительный контекст, приложение обрабатывает аутентификацию API с помощью токена (JWT). К сожалению, в полезной информации нет информации о пользователе.
Существует архитектура MVVM, и есть уровень репозитория, который вызывает модифицированный API / room db.
Вот вещи, которые я изучаю, хотелось бы узнать, есть ли какие-нибудь более эффективные пути или есть другой шаблон / архитектура, который я еще не обнаружил:
- В настоящее время объект
User
сохраняется в классе Application. Я ненавижу это лично, это то, что существовало ранее. После успешного входа в систему JWT сохраняется в SharedPreferences, а объект User сохраняется как статическая переменная в классе Application.
- Сразу же возникает мысль сохранить хотя бы важные биты пользователя в SharedPreferences. Я пытался найти способ «связать» пользователя с JWT, хотя общие предпочтения не очень хорошо работают с объектами. Я представляю сценарий, в котором у меня может быть сохраненный токен для одного пользователя, но объект
User
для другого, который вызовет всевозможные проблемы.
- Наряду с нашим сервисным уровнем модифицированного API, появилась базовая комната Room db, поскольку я медленно пытаюсь включить локальное кэширование в приложение. Так что я знаю, что могу сохранить
User
здесь, хотя беспокоюсь об асинхронной природе вызовов БД.
- Я чувствую, что мне нужен какой-то архитектурный слой,
SesssionManager
или что-то, что заботится обо всем этом. Будет «удерживать» пользователя, токен, имеющий глобальный метод Logout()
, так или иначе, он будет хорошо играть со слоем хранилища, так что View и ViewModels не нужно вообще беспокоиться о пользователе или userId, просто сделайте различные вызовы репозитория и слои данных (сервис репозитория / дооснащения) будут возвращать то, что подходит для текущего вошедшего в систему пользователя и т. д.
Извините, если это немного абстрактный / высокий уровень без какого-либо конкретного кода, я просто помню, как несколько месяцев назад нашел отличную статью, связанную с этим понятием слоя сеанса, и не ставил его в закладки, а теперь пытаюсь почесать голову разработать лучший способ добиться этого чисто.