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. Но затем каждый раз, когда я инициализирую своего пользователя где-нибудь в коде, я должен предоставить все параметры конструкторов, что совсем не хорошо.