Spring Boot Data Rest JPA - Entity custom create (User) -
i trying learn spring. created project spring boot using following tools:
- spring data jpa
- spring data rest
- spring hateoas
- spring security
i trying create user
entity. want user have encrypted password (+ salt).
when post
/api/users
create new user.
{ "firstname":"john", "lastname":"doe", "email":"johndoe@example.com", "password":"12345678" }
but have 2 problems:
- the password saved in clear-text
- the salt null
+----+---------------------+-----------+----------+----------+------+ | id | email | firstname | lastname | password | salt | +----+---------------------+-----------+----------+----------+------+ | 1 | johndoe@example.com | john | doe | 12345678 | null | +----+---------------------+-----------+----------+----------+------+
the problem think default constructor used , not other 1 have created. new spring , jpa must missing something. here 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 finds did wrong, point me where/how should put user login code (decryption).
thanks.
if want spring use constructor, need to
- remove no-argument constructor
- annotate every parameter in other constructor
@jsonproperty
this
public user(@jsonproperty("email") string email, @jsonproperty("firstname") string firstname, @jsonproperty("lastname") string lastname, @jsonproperty("password") string password) { this.email = email; this.firstname = firstname; this.lastname = lastname; this.password = new bcryptpasswordencoder().encode(password); }
you don't need provide salt value bcryptpasswordencoder
because salts passwords itself.
Comments
Post a Comment