Как обновить состояние другого пользователя в Spring Security?

Предположим, 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>

Как загрузить пользователя? Вы сохраняете пользователя в HTTP-сеансе. Покажите свою конфигурацию Spring Security и ваш контроллер, который показывает результат.

dur 19.08.2018 20:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
131
1

Ответы 1

Вы можете использовать события, отправленные сервером (sse), как вариант потоковой передачи http. Это нужно для отправки события слушателям по протоколу http. Springboot имеет класс SseEmitter для поддержки sse

См. Пример для принудительной отправки с sse https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/sse-emitter.html

Другие вопросы по теме