java.lang.ClassCastException:class org.springframework.security.core.userdetails.User不能强制转换为类
我的spring boot应用程序有问题。我正在发送获取密钥的请求,但出现错误java.lang.ClassCastException:class org.springframework.security.core.userdetails.User不能强制转换为类,java,spring,spring-boot,spring-mvc,spring-security,Java,Spring,Spring Boot,Spring Mvc,Spring Security,我的spring boot应用程序有问题。我正在发送获取密钥的请求,但出现错误 java.lang.ClassCastException: class org.springframework.security.core.userdetails.User cannot be cast to class com.spring.springBlogProject.model.User (org.springframework.security.core.userdetails.User and co
java.lang.ClassCastException: class org.springframework.security.core.userdetails.User cannot be cast to class com.spring.springBlogProject.model.User (org.springframework.security.core.userdetails.User and com.spring.springBlogProject.model.User are in unnamed module of loader 'app')
at com.spring.springBlogProject.security.JwtProvider.generateToken(JwtProvider.java:28) ~[classes/:na]
我不明白问题是什么,我第一次使用spring。我发现接收到的数据不能简化为我创建的类。有什么问题吗?下面是我的课程,我使用的是SpringBootV2.3.1.0版本
谢谢你的帮助
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username).orElseThrow(()->
new UsernameNotFoundException("No user found with " + username));
return new org.springframework.security.core.userdetails.User(user.getUsername(),
user.getPassword(),
true,true,true,true,
getAuthorities("ROLE_USER"));
}
private Collection<? extends GrantedAuthority> getAuthorities(String role_user) {
return Collections.singletonList(new SimpleGrantedAuthority(role_user));
}
}
您必须按照以下方式在UserDetails中转换它
public class JwtUser implements UserDetails {
private final long id;
private final String email;
private final String phoneNo;
private final String username;
private final String password;
private final boolean enabled;
private final Collection<? extends GrantedAuthority> authorities;
public JwtUser(long userId, String email, String username, String phoneNo, String password, Boolean enabled, Collection<? extends GrantedAuthority> authorities) {
this.id = userId;
this.email = email;
this.phoneNo = phoneNo;
this.username = username;
this.password = password;
this.enabled = enabled;
this.authorities = authorities;
}
public long getId() {
return id;
}
public String getEmail() {
return email;
}
public String getPhoneNo() {
return phoneNo;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return enabled;
}
}
与:
return new JwtUser(user.get().getUserId(), user.get().getEmail(), user.get().getUsername(),
user.get().getPhoneNo(), user.get().getPassword(), Boolean.TRUE, grantedAuthoritySet(user.get().getAuthorities()));
非常感谢。这是工作,但我不明白怎么做。我们创建类并实现userDetails接口。我可以在类User中实现这个接口吗,或者我们需要创建JwtUser?目前我在办公室,我会尽快回答你。事实证明,无论我在哪里需要使用User,我都使用JwtUser?对吗?很抱歉回复太晚了实际上我忘了。安全性库使用UserDetails,其中包含一些预定义的数据成员&getter setter,并相应地配置了安全性内部流程。因此,当您想要使用它时,您必须在userdetails Entity中转换您的用户数据,因为您的用户有许多列,这对于安全检查是不必要的。因此,我维护名为JWTUser的类,该类执行此操作并将其转换为UserDetails。你们可以用匿名的方法在同一个班级里用你们自己的方式来管理它。若你们方面同意的话,请你们投票表决这个答案好吗?
public class JwtUser implements UserDetails {
private final long id;
private final String email;
private final String phoneNo;
private final String username;
private final String password;
private final boolean enabled;
private final Collection<? extends GrantedAuthority> authorities;
public JwtUser(long userId, String email, String username, String phoneNo, String password, Boolean enabled, Collection<? extends GrantedAuthority> authorities) {
this.id = userId;
this.email = email;
this.phoneNo = phoneNo;
this.username = username;
this.password = password;
this.enabled = enabled;
this.authorities = authorities;
}
public long getId() {
return id;
}
public String getEmail() {
return email;
}
public String getPhoneNo() {
return phoneNo;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return enabled;
}
}
return new org.springframework.security.core.userdetails.User(user.getUsername(),
user.getPassword(),
true,true,true,true,
getAuthorities("ROLE_USER"));
return new JwtUser(user.get().getUserId(), user.get().getEmail(), user.get().getUsername(),
user.get().getPhoneNo(), user.get().getPassword(), Boolean.TRUE, grantedAuthoritySet(user.get().getAuthorities()));