java.lang.ClassCastException: org.springframework.security.core.userdetails.User no se puede enviar al modelo.

Estoy usando Spring Security en mi aplicación. Necesito detalles de usuario registrados en los controladores de mi aplicación.

Para eso estoy usando este código

User loggedInUser = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

Pero al ejecutar este código obtengo una classcastexception

java.lang.ClassCastException: org.springframework.security.core.userdetails.User cannot be cast to model.User

Para arreglar esto me referí a estoartículo

Inicialmente utilicé una clase CustomUserServiceDetails

@Service("myUserDetailService")
@Transactional
public class CustomUserDetailsService implements UserDetailsService {

    private static final Logger logger = Logger.getLogger(CustomUserDetailsService.class);

    @Autowired
    private UserDAO userDAO;

    public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException, DataAccessException {
        // returns the get(0) of the user list obtained from the db
        User domainUser = userDAO.getUser(name);
        logger.debug("User fetched from database in loadUserByUsername method " + domainUser);

        Set<Role> roles = domainUser.getRole();
        logger.debug("role of the user" + roles);

        Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
        for(Role role: roles){
            authorities.add(new SimpleGrantedAuthority(role.getRole()));
            logger.debug("role" + role + " role.getRole()" + (role.getRole()));
        }

        boolean credentialNonExpired = true;

        return new org.springframework.security.core.userdetails.User(domainUser.getProfileName(), domainUser.getPassword(), domainUser.isAccountEnabled(),
                domainUser.isAccountNonExpired(), credentialNonExpired, domainUser.isAccountNonLocked(),authorities);

    }

}

Pero después de referirme al artículo, eliminé la configuración de GrantedAuthorities de aquí y la moví a mi clase de Usuario. Se implementó la clase UserDetails de spring-security en mi clase User

Ahora tengo una propiedad adicional en mi clase de usuario

@Entity
@Table(name = "user")
public class User implements UserDetails {
    private Collection<GrantedAuthority> authorities;

con un setMethod

public void setAuthorities(Set<Role> roles) {
        Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
        for(Role role: roles){
            authorities.add(new SimpleGrantedAuthority(role.getRole()));}
    }

A. No estoy seguro de cómo asignar esta propiedad a la base de datos. El esquema de tabla de usuario existente no contiene una columna GrantedAuthority además de que ni siquiera es un tipo primitivo. Estoy usando Hibernate para el mapeo de objetos. ¿Alguien puede aconsejarme el enfoque correcto para obtener la información de clase de usuario en los controladores?

B. También consideré el enfoque de extender la clase de usuario de Spring y sobrecargar el constructor de mi clase de usuario. Pero luego, cada vez que inicializo a mi Usuario en cualquier parte del código, tengo que proporcionar todos los parámetros de los constructores, lo cual no es bueno en absoluto.

Respuestas a la pregunta(3)

Su respuesta a la pregunta