AuthenticatedUser.java

package com.privacydashboard.application.security;

import com.privacydashboard.application.data.entity.User;
import com.privacydashboard.application.data.service.UserRepository;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.server.VaadinServletRequest;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class AuthenticatedUser {
    private final UserRepository userRepository;
    @Autowired
    public AuthenticatedUser(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    private Optional<Authentication> getAuthentication() {
        SecurityContext context = SecurityContextHolder.getContext();
        return Optional.ofNullable(context.getAuthentication())
                .filter(authentication -> !(authentication instanceof AnonymousAuthenticationToken));
    }



    public Optional<User> get() {
        return getAuthentication().map(authentication -> userRepository.findByName(authentication.getName()));
    }

    // AGGIUNTA, RESTITUISCE USER SENZA DOVER OGNI VOLTA GUARDARE IL DB. E' SICURO??????
    public User getUser(){
        if(UI.getCurrent().getSession().getAttribute("user")==null){
            Optional<User> maybeUser=get();
            if (maybeUser == null) {
                maybeUser = getAuthentication().map(authentication -> userRepository.findByName(authentication.getName()));
            }
            maybeUser.ifPresent(user -> UI.getCurrent().getSession().setAttribute("user", user));
        }
        return (User) UI.getCurrent().getSession().getAttribute("user");



    }

    public User updateUser(){
        Optional<User> maybeUser=get();
        maybeUser.ifPresent(user -> UI.getCurrent().getSession().setAttribute("user", user));
        return (User) UI.getCurrent().getSession().getAttribute("user");
    }


    public void logout() {
        UI.getCurrent().getPage().setLocation(SecurityConfiguration.LOGOUT_URL);
        SecurityContextLogoutHandler logoutHandler = new SecurityContextLogoutHandler();
        logoutHandler.logout(VaadinServletRequest.getCurrent().getHttpServletRequest(), null, null);
    }

}