Próbuję nauczyć się wiosny. I stworzył projekt ze sprężyną Boot za pomocą następujących narzędzi:Spoczynkowe dane startowe WZP - Entity niestandardowe tworzenie (Użytkownik)
- Wiosna danych JPA
- Wiosna danych REST
- Wiosna hateoas
- Wiosna zabezpieczeń
próbuję stworzyć User
jednostka. Chcę, aby użytkownik miał zaszyfrowane hasło (+ sól).
Po wykonaniu POST
do /api/users
pomyślnie utworzę nowego użytkownika.
{
"firstname":"John",
"lastname":"Doe",
"email":"[email protected]",
"password":"12345678"
}
Ale mam 2 problemy:
- hasło jest zapisane w postaci zwykłego tekstu
- sól jest null
+----+---------------------+-----------+----------+----------+------+ | id | email | firstname | lastname | password | salt | +----+---------------------+-----------+----------+----------+------+ | 1 | [email protected] | John | Doe | 12345678 | NULL | +----+---------------------+-----------+----------+----------+------+
Problem domyślnie jest używany domyślny konstruktor a nie drugi, który stworzyłem. Jestem nowy w Spring i JPA, więc muszę czegoś przegapić. Oto mój kod.
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);
}
}
Także jeśli y omeone znajduje to, co zrobiłem źle, chciałbym wskazać mi gdzie/jak powinienem podać kod logowania użytkownika (deszyfrowanie).
Dzięki.
gdzie jest Twój REST @RestController? – Makoton
@Makoton nie mam. Spring Data Rest automatycznie eksponuje moje jednostki w RESTful API. Czy w takim przypadku potrzebuję jednego? –
i czy próbujesz utworzyć usługę UserService i: public void registerUser (końcowy użytkownik) { final Ciąg zakodowanyPassword = hasłoEncoder.encode (user.getPassword()); user.setPassword (encodedPassword); userRepo.save (użytkownik); } – Makoton