Этот подход работает для нас.
На стороне Auth Server db необходимо хранить только: настроенный идентификатор пользователя, URL-адреса перенаправления и авторизованный уровень обслуживания (области); предоставленные токены доступа; и другие авторизация необходимые данные (роли в вашем случае).
Сервер входа в систему db, хранит: идентификатор пользователя, пароль и другие аутентификация связанные данные.
Служба пользовательских ресурсов (обычно это RESTFul API) должна хранить: идентификатор пользователя и другие личные данные .
По запросу нового пользователя о данных защищенного ресурса (здесь требуется определенная область), перенаправляет на сервер входа в систему с этой успешной аутентификацией, перенаправляет на сервер проверки подлинности, чтобы предоставить разрешения с использованием этой области, сгенерировать токен доступа и перенаправить к защищенному ресурсу с токеном доступа сервер ресурсов проверяет токен и область (некоторые реализации также делают еще один вызов к серверу аутентификации, чтобы проверить это с помощью JWT), чтобы наконец разрешить первоначальный запрос пользователя.
В общем, я лично использую принцип DRY с такой архитектурой.
Ура!