Обновление полей принципала во время выполнения - PullRequest
0 голосов
/ 01 октября 2019

Я использую аутентификацию OAuth2 со своим собственным сервером авторизации и ресурсов в Spring Boot. Я хочу изменить некоторые поля в моем User implements UserDetails (это мой Principal) объект во время выполнения от имени того же пользователя или от имени другого пользователя (администратор / модератор). Например, user1 с id = 1 хочет изменить свою страну, поэтому он вызывает этот метод:

@PostMapping("/setMyCountry")
public void setMyCountry(@CurrentUser User user, @RequestParam String newCountry){
    user.setCountry(newCountry);
    userRepository.save(user);
}

Но когда я хочу проверить его страну, используя это:

@GetMapping("/getMyCountry")
public String getMyCountry(@CurrentUser User user){
    return user.getCountry();
}

Iполучить ту же старую страну.

Аналогично, с изменениями от имени администратора:

@PostMapping("/setUserCountry")
public void setUserCountry(@CurrentUser Moderator moderator, @RequestParam String newCountry){
    User user = userRepository.findById(1L).get();
    user.setCountry(newCountry);
    userRepository.save(user);
}

@GetMapping("/getUserCountry")
public String getUserCountry(@CurrentUser Moderator moderator){
    User user = userRepository.findById(1L).get();
    return user.getCountry();
}

Возвращает ту же страну. Но, конечно, БД показывает новое значение.

Я уже видел вопрос о подобных проблемах, но если я использую это в setMyCountry():

Authentication newAuth = new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(newAuth);

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

Итак, как я могу изменить поле User и обновить текущий участник безвыйти и войти?

1 Ответ

1 голос
/ 02 октября 2019

Обычной практикой при использовании oauth2 является то, что сервер аутентификации ничего не знает о пользователях, больше, чем имя пользователя, пароль, какие роли и какой-то ключ, чтобы он мог искать объект пользователя. Это может быть уникальный UUID или имя пользователя (тема), как в адресе электронной почты.

Сервер ресурсов получает токен от клиента, он берет этот токен и затем вызывает сервер авторизации для проверки токена,сервер авторизации проверяет его и, если он проверен, затем отправляет информацию на сервер ресурсов, чтобы сервер ресурсов мог заполнить свой объект UserDetails.

Если серверу ресурсов необходимо узнать, в какой стране живет этот пользователь, он получаетидентификатор из объекта Principal / UserDetails, а затем вызывает, возможно, пользовательскую службу, или другую базу данных, или другую таблицу, или даже обратно на сервер авторизации, который может иметь конечную точку / user и представляет токен серверу авторизации (который, в свою очередь, в свою очередь). получает основную информацию, получает тему, а затем ищет в базе данных информацию о пользователе) и затем отправляет объект пользователя обратно.

Что я хочу сказать, так это то, что вы всегда должны разделять Аутентификацию и Авторизацию (роли и т. д.)информация, из актаual Информация о пользователе.

Что делать, если вы перейдете от, скажем, аутентификации facebook к аутентификации github. Вам нужно повторить все пользователи? нет, поскольку у вас есть вся информация о пользователе, отделенная от информации об авторизации.

...