Я сделал это один раз, но я не совсем уверен, что это правильный подход:
Каждый пользователь имел имя пользователя, идентификатор сеанса, роли и дату входа в систему, прикрепленные к объекту пользователя. Каждый раз, когда я входил в виртуальную машину, система загружала объект User в память; Я бы также вернул объект пользователя в приложение.
Если бы мне нужно было выполнить действие на сервере приложений, я бы отправил объект пользователя в качестве аргумента. Если на виртуальную машину загружен пользователь с тем же идентификатором сеанса, то он будет использовать объект, хранящийся на виртуальной машине, для определения назначенных ролей. В противном случае приложение сможет изменять роли пользователя и не будет защищено.
Если приложение должно было изменить сервер приложений, оно отправляет объект пользователя на новый сервер, и новый сервер не сможет найти пользователя в своих записях.
ЗДЕСЬ СЕКРЕТ: Идентификатор сеанса создается с хэшированием имени пользователя, даты входа в систему и секретного пароля, общего для всех серверов.
Как только новый сервер обнаружит, что идентификатор сеанса согласован, он загрузит роли из базы данных в качестве надежного источника информации.
Извините, если я не смог написать это раньше, но надеюсь, что это кому-нибудь поможет.