I have been working on a spring boot project using database MySQL on macOS using netbeans and eclipse IDE. I am new to this tech-stack and have been trying to resolve the login error. On trying to login after successfully registering, I am getting the error message that Invalid username or password despite entering valid details from the table.
The UserLogin.html file:
<div class="form-center">
<div class="center">
<h1>Login</h1>
<form th:action="@{/UserLogin}" method="post" >
<!-- error message -->
<div th:if="${param.error}">
<div class="alert alert-danger">Invalid username or password.</div>
</div>
<!-- logout message -->
<div th:if="${param.logout}">
<div class="alert alert-info">You have been logged out.</div>
</div>
<div class="txt_field">
<input type="text" required>
<span></span>
<label>Email ID</label>
</div>
<div class="txt_field">
<input type="password" required>
<span></span>
<label>Password</label>
</div>
<div class="pass"><a href="/" th:href="@{/forgotPasswordUser}">Forgot Password?</a></div>
<input type="submit" value="Login">
<div class="signup_link">
Not a member? <a href="/" th:href="@{/registration}">Sign-Up</a>
</div>
</form>
</div>
</div>
The UserRepository.java code:
package net.cdac.TMS.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import net.cdac.TMS.model.User;
@Repository
public interface UserRepository extends JpaRepository<User, String>{
@Query("SELECT u FROM User u WHERE u.uemailid = ?1")
User findByUemailid(String uemailid);
}
The User.java file:
package net.cdac.TMS.model;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.persistence.JoinColumn;
@Entity
@Table(name = "user", uniqueConstraints = @UniqueConstraint(columnNames = "uemailid"))
public class User implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "uemailid", unique=true)
private String uemailid;
@Column(name = "uname")
private String uName;
private String upassword;
private String usecurityQ;
private String usecurityA;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "users_roles",
joinColumns = @JoinColumn( name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
private List<Role> roles;
public User() {
}
public User(String email, String password) {
}
public User(String Name, String email, String password, String securityQ, String securityA, List<Role> roles) {
super();
this.uName = Name;
this.uemailid = email;
this.upassword = password;
this.usecurityQ = securityQ;
this.usecurityA = securityA;
this.roles = roles;
}
public String getUemailid() {
return uemailid;
}
public void setUemailid(String uemailid) {
this.uemailid = uemailid;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
public String getUpassword() {
return upassword;
}
public void setUpassword(String upassword) {
this.upassword = upassword;
}
public String getUsecurityQ() {
return usecurityQ;
}
public void setUsecurityQ(String usecurityQ) {
this.usecurityQ = usecurityQ;
}
public String getUsecurityA() {
return usecurityA;
}
public void setUsecurityA(String usecurityA) {
this.usecurityA = usecurityA;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
}
The UserServiceImpl.java :
package net.cdac.TMS.service;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import net.cdac.TMS.model.Role;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import net.cdac.TMS.model.User;
import net.cdac.TMS.repository.RoleRepository;
import net.cdac.TMS.repository.UserRepository;
import net.cdac.TMS.web.dto.UserRegistrationDto;
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserRepository userRepository;
@Autowired
private RoleRepository roleRepository;
@Autowired
private BCryptPasswordEncoder passwordEncoder;
public UserServiceImpl(UserRepository userRepository) {
super();
this.userRepository = userRepository;
}
@Override
public User save(UserRegistrationDto registrationDto) {
Role urole = new Role("ROLE_USER");
Role uroles = roleRepository.save(urole);
User user = new User(registrationDto.getuName(),registrationDto.getUemail(),
passwordEncoder.encode(registrationDto.getUpassword()),registrationDto.getUsecurityQ(),registrationDto.getUsecurityA(),Arrays.asList(uroles) );
return userRepository.save(user);
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUemailid(username);
if(user == null) {
throw new UsernameNotFoundException("Invalid username or password or User does not exist!");
}
return new org.springframework.security.core.userdetails.User(user.getUemailid(), user.getUpassword(), mapRolesToAuthorities(user.getRoles()));
}
private Collection<? extends GrantedAuthority> mapRolesToAuthorities(Collection<Role> roles){
return roles.stream().map(role -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList());
}
}
The MainController.java
package net.cdac.TMS.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MainController {
@GetMapping("/UserLogin")
public String login() {
return "UserLogin";
}
@GetMapping("/")
public String home() {
return "GuestHome";
}
}
On console it's showing :
2022-09-15 14:55:16.261 TRACE 81374 --- [nio-8787-exec-5] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - []
2022-09-15 14:57:51.170 DEBUG 81374 --- [nio-8787-exec-6] org.hibernate.SQL :
select
user0_.id as id1_1_,
user0_.uname as uname2_1_,
user0_.uemailid as uemailid3_1_,
user0_.upassword as upasswor4_1_,
user0_.usecuritya as usecurit5_1_,
user0_.usecurityq as usecurit6_1_
from
user user0_
where
user0_.uemailid=?
Hibernate:
select
user0_.id as id1_1_,
user0_.uname as uname2_1_,
user0_.uemailid as uemailid3_1_,
user0_.upassword as upasswor4_1_,
user0_.usecuritya as usecurit5_1_,
user0_.usecurityq as usecurit6_1_
from
user user0_
where
user0_.uemailid=?
2022-09-15 14:57:51.170 TRACE 81374 --- [nio-8787-exec-6] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - []
Please help me in resolving this login issue and how to successfully login and redirect to the GuestHome.html page.