Как вы можете хранить данные о пользователе, не прошедшем проверку подлинности, во время сброса пароля в SecurityContextHolder? - PullRequest
0 голосов
/ 08 октября 2018

Я недавно работал над функцией сброса пароля в приложении Spring Boot и столкнулся с проблемой, касающейся Spring Security.

В соответствии с руководством, на котором я сейчас ориентируюсь (https://www.baeldung.com/spring-security-registration-i-forgot-my-password),), необходимо отправить электронное письмо пользователю, который больше не может запомнить свой пароль, чтобы он мог установить новый.Как только он нажимает на ссылку, метод сопоставления должен убедиться, что уникальный токен, содержащийся в этой самой ссылке, в порядке (т. Е. Он соответствует пользователю, который отправил ссылку и еще не истек). Если это так, то SimpleGrantedAuthority привилегия должна быть установлена ​​в объекте аутентификации, который затем будет передан SecurityContextHolder следующим образом:

Authentication auth = new UsernamePasswordAuthenticationToken (user, null, Arrays.asList (new SimpleGrantedAuthority ("CHANGE_PASSWORD_PRIVILEGE"))); SecurityContextHolder.getContext (). setAuthentication (auth);

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

Возвращаясь к самой проблеме: когда я сохраняю информацию пользователя в ContextHolder, она остаетсядоступно, пока я нахожусь в методе запроса, где я установил его в первую очередь, однако он исчезает после того, как я попал в другой метод REST для его получения.Там можно видеть только AnonymousUser String в качестве принципала, что, очевидно, не то, что я хочу.Поэтому я спрашивал себя, как вы можете поддерживать эту информацию без необходимости входа в систему пользователя.Я скептически относился к тому, что автор учебника просто устанавливает эту информацию в contextHolder, не создавая FilterChain и не получая ее впоследствии.Я совершенно новичок в теме Spring Security, поэтому не критикуйте меня слишком сильно:)

С наилучшими пожеланиями,
Дима

...