java.lang.ClassCastException: org.springframework.security.core.userdetails.User не может быть приведен к модели.

Я использую Spring Security в своем приложении. Мне нужно войти в пользовательские данные в контроллерах моего приложения.

Для этого я использую этот код

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

Но при запуске этого кода я получаю исключение

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

Чтобы исправить это, я сослался на этостатья

Изначально я использовал класс 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);

    }

}

Но после обращения к статье я удалил отсюда настройку GrantedAuthorities и перенес ее в свой класс User. В моем классе User реализован класс UserDetails с пружинной безопасностью

Теперь у меня есть дополнительное свойство в моем классе User

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

с setMethod

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

A. Я не уверен, как сопоставить это свойство с базой данных. Существующая схема таблицы User не содержит столбец GrantedAuthority, кроме того, это даже не примитивный тип. Я использую Hibernate для отображения объектов. Может кто-нибудь посоветовать мне правильный подход для получения информации о классе пользователя в контроллерах?

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

Ответы на вопрос(3)

Ваш ответ на вопрос