class cannot be cast to class(Refresh token login part spring)
Postman : post method /login -> body {"email" : ... , "password" : ...}
If: user and password is correct-> "class .models.AppUser cannot be cast to class .services.UserDetailsImpl (.models.AppUser and .services.UserDetailsImpl are in unnamed module of loader 'app')"
If : user or password incorrect-> Bad credentials (application work, generated message for error)
if: user enabled == 0 -> User is disabled (application work, generated message for error)
AppUser:
@Getter
@Setter
@Entity
@Table( name = "app_user",
uniqueConstraints = {
@UniqueConstraint(columnNames = "email")
})
public class AppUser implements UserDetails {
@SequenceGenerator(
name = "user_sequence",
sequenceName = "user_sequence",
allocationSize = 1
)
@Id
@GeneratedValue(
strategy = GenerationType.IDENTITY
)
private Long id;
private String firstName;
private String lastName;
@Column(name = "email", nullable = false)
private String email;
@Column(name = "password", nullable = false)
private String password;
@Enumerated(EnumType.STRING)
private AppUserRole appUserRole;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
private Boolean locked = false;
private Boolean enabled = false;
@Column(name = "reset_token")
private String resetToken;
public AppUser() {
}
public AppUser(String firstName,
String lastName,
String email,
String password,
AppUserRole appUserRole
) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.password = password;
this.appUserRole = appUserRole;
}
public void setFields(DtoUser dtoUser) {
this.email = dtoUser.getEmail();
this.enabled = dtoUser.getEnabled();
this.firstName = dtoUser.getFirstName();
this.lastName = dtoUser.getLastName();
this.locked = dtoUser.getLocked();
this.password = dtoUser.getPassword();
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
SimpleGrantedAuthority authority =
new SimpleGrantedAuthority(appUserRole.name());
return Collections.singletonList(authority);
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return email;
}
public void setUsername(String email) {
this.email = email;
}
public void setEmail(String email) {
this.email = email;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getResetToken() {
return resetToken;
}
public void setResetToken(String resetToken) {
this.resetToken = resetToken;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return !locked;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return enabled;
}
public static UserDetailsImpl castToUserDetails(AppUser appUser) {
return new UserDetailsImpl(appUser.getId(), appUser.getEmail(), appUser.getPassword(), (List<GrantedAuthority>) appUser.getAuthorities());
}
}
Registration: enter image description here
public String register(RegistrationRequest request) {
boolean isValidEmail = emailValidator.
test(request.getEmail());
if (!isValidEmail) {
throw new IllegalStateException("email not valid");
}
String token = appUserService.signUpUser(
new AppUser(
request.getFirstName(),
request.getLastName(),
request.getEmail(),
request.getPassword(),
AppUserRole.USER
)
);
String link = "http://localhost:8085/api/v1/registration/confirm?token=" + token;
emailSender.send(
request.getEmail(),
buildEmail(request.getFirstName(), link));
return token;
}
@Transactional
public String confirmToken(String token) {
ConfirmationToken confirmationToken = confirmationTokenService
.getToken(token)
.orElseThrow(() ->
new IllegalStateException("token not found"));
if (confirmationToken.getConfirmedAt() != null) {
throw new IllegalStateException("email already confirmed");
}
LocalDateTime expiredAt = confirmationToken.getExpiresAt();
if (expiredAt.isBefore(LocalDateTime.now())) {
throw new IllegalStateException("token expired");
}
confirmationTokenService.setConfirmedAt(token);
appUserService.enableAppUser(
confirmationToken.getAppUser().getEmail());
return "confirmed";
}
UserDetailsImpl:
public class UserDetailsImpl implements UserDetails { private static final long serialVersionUID = 1L;
private Long id;
private static AppUserRole appUserRole;
private String email;
@JsonIgnore
private String password;
private Collection<? extends GrantedAuthority> authorities;
public UserDetailsImpl(Long id, String email, String password,
Collection<? extends GrantedAuthority> authorities) {
this.id = id;
this.email = email;
this.password = password;
this.authorities = this.authorities;
}
public static UserDetailsImpl build(AppUser user) {
return new UserDetailsImpl(
user.getId(),
user.getUsername(),
user.getPassword(),
(List<GrantedAuthority>) user.getAuthorities());
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
public Long getId() {
return id;
}
public String getEmail() {
return email;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return email;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
UserDetailsImpl user = (UserDetailsImpl) o;
return Objects.equals(id, user.id);
}
}
Controller login:
@PostMapping("/login")
public ResponseEntity<?> authenticateUser(@RequestBody LoginRequest loginRequest) {
Authentication authentication = authenticationManager
.authenticate(new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));
SecurityContextHolder.getContext().setAuthentication(authentication);
UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();
String jwt = jwtUtils.generateJwtToken(userDetails);
List<String> roles = userDetails.getAuthorities().stream().map(item -> item.getAuthority())
.collect(Collectors.toList());
RefreshToken refreshToken = refreshTokenService.createRefreshToken(userDetails.getId());
return ResponseEntity.ok(new SignupResponse(jwt, refreshToken.getToken(), userDetails.getId(),
userDetails.getEmail(), roles));
}
JWT UTILS:
public class JwtUtils {
private static final Logger logger = LoggerFactory.getLogger(JwtUtils.class);
@Value("${crystal.jwtSecret}")
private String jwtSecret;
@Value("${crystal.jwtExpirationMs}")
private int jwtExpirationMs;
public String generateJwtToken(UserDetailsImpl userPrincipal) {
return generateTokenFromUsername(userPrincipal.getUsername());
}
public String generateTokenFromUsername(String username) {
return Jwts.builder().setSubject(username).setIssuedAt(new Date())
.setExpiration(new Date((new Date()).getTime() + jwtExpirationMs)).signWith(SignatureAlgorithm.HS512, jwtSecret)
.compact();
}
public String getUserNameFromJwtToken(String token) {
return Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody().getSubject();
}
public boolean validateJwtToken(String authToken) {
try {
Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken);
return true;
} catch (SignatureException e) {
logger.error("Invalid JWT signature: {}", e.getMessage());
} catch (MalformedJwtException e) {
logger.error("Invalid JWT token: {}", e.getMessage());
} catch (ExpiredJwtException e) {
logger.error("JWT token is expired: {}", e.getMessage());
} catch (UnsupportedJwtException e) {
logger.error("JWT token is unsupported: {}", e.getMessage());
} catch (IllegalArgumentException e) {
logger.error("JWT claims string is empty: {}", e.getMessage());
}
return false;
}
WebSecurity
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(
// securedEnabled = true,
// jsr250Enabled = true,
prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
AppUserService userDetailsService;
@Autowired
private AuthenticationEntryPointJwt unauthorizedHandler;
@Bean
public AuthenticationTokenFilter authenticationJwtTokenFilter() {
return new AuthenticationTokenFilter();
}
@Override
public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable()
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests().antMatchers("**").permitAll()
.antMatchers("**").permitAll()
.anyRequest().authenticated();
http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
}
}
How many English words
do you know?
do you know?
Test your English vocabulary size, and measure
how many words do you know
Online Test
how many words do you know
Powered by Examplum