Предположим, User может нравиться Post. когда пост понравился, оценка поста автор (другой User) увеличивается. Обновляю состояние автора в базе:
post.getAuthor().incrementScore(LIKE_SCORE);
postRepository.save(post); \\ author is also updated
но проблема в том, что если автор в настоящее время вошел в систему, изменения не отражаются на нем, и он должен повторно войти в систему, чтобы увидеть свою обновленную оценку.
Как я могу обновить состояния другого аутентифицированного пользователя в Spring Security?
Обратите внимание, что я не добавляю пользователя в свой контроллер, а получаю доступ непосредственно в шаблоне. Я что делаю неправильно?
Сущность пользователя:
@Entity
@EqualsAndHashCode(of = "username")
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@ManyToMany(mappedBy = "likers", fetch = EAGER)
private Set<Post> favorites = new HashSet<>();
@OneToMany(mappedBy = "author", fetch = EAGER)
private Set<Post> posts = new HashSet<>();
@NaturalId
private String username;
private String password;
private long score;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Set.of(new SimpleGrantedAuthority("ROLE_" + role));
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
// other overridden methods, getters and setters
}
Конфигурация безопасности:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(encoder);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll()
.and().formLogin().usernameParameter("username").passwordParameter("password")
.loginProcessingUrl("/login")
.successHandler((request, response, authentication) ->
response.getOutputStream().print(true))
.failureHandler((request, response, exception) ->
response.getOutputStream().print(""))
.and().logout()
.logoutSuccessHandler((request, response, authentication) ->
response.sendRedirect(request.getHeader("referer")))
.and().cors().disable();
}
Шаблон Тимелеафа:
<div class = "nav">
<div class = "author">
<div class = "usr-name" th:text = "${#authentication.principal.username}"></div>
<div class = "score" th:text = "${#authentication.principal.score}"></div>
</div>
</div>




Вы можете использовать события, отправленные сервером (sse), как вариант потоковой передачи http. Это нужно для отправки события слушателям по протоколу http. Springboot имеет класс SseEmitter для поддержки sse
См. Пример для принудительной отправки с sse https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/sse-emitter.html
Как загрузить пользователя? Вы сохраняете пользователя в HTTP-сеансе. Покажите свою конфигурацию Spring Security и ваш контроллер, который показывает результат.