I am trying to learn Spring. I created the project using Spring Boot using the following tools:
- Spring JPA Data
- Spring data rest
- Spring hateas
- Spring Security
I am trying to create a User object. I want the user to have an encrypted password (+ salt).
When I do POST before /api/users , I successfully create a new user.
{ "firstname":"John", "lastname":"Doe", "email":" johndoe@example.com ", "password":"12345678" }
But I have 2 problems:
- password is stored in text
- salt is zero
+----+---------------------+-----------+----------+----------+------+ | id | email | firstname | lastname | password | salt | +----+---------------------+-----------+----------+----------+------+ | 1 | johndoe@example.com | John | Doe | 12345678 | NULL | +----+---------------------+-----------+----------+----------+------+
The problem is that the default constructor is used, and not the other that I created. I am new to Spring and JPA, so I have to skip something. Here is my code.
User.java
@Entity @Table(name = "users") public class User{ @Id @GeneratedValue private Long id; @Column(nullable = false) public String firstname; @Column(nullable = false) public String lastname; @Column(nullable = false, unique = true) public String email; @JsonIgnore @Column(nullable = false) public String password; @JsonIgnore @Column private String salt; public User() {} public User(String email, String firstname, String lastname, String password) { this.email = email; this.firstname = firstname; this.lastname = lastname; this.salt = UUID.randomUUID().toString(); this.password = new BCryptPasswordEncoder().encode(password + this.salt); } @JsonIgnore public String getSalt() { return salt; } @JsonProperty public void setSalt(String salt) { this.salt = salt; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } @JsonIgnore public String getPassword() { return password; } @JsonProperty public void setPassword(String password) { this.password = password; } }
UserRepository.java
public interface UserRepository extends JpaRepository<User, Long> { public User findByEmail(String email); public User findByEmailAndPassword(String email, String password); }
Application.java
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application .class, args); } }
Also, if someone finds out what I did wrong, I would like to tell me where / how I should put the user login code (decryption).
Thanks.