2015-07-14 8 views
5

Sto cercando di imparare Spring. Ho creato un progetto con la primavera di avvio utilizzando i seguenti strumenti:Spring Boot Data Rest JPA - Creazione personalizzata entità (Utente)

  • primavera dati JPA
  • primavera dati REST
  • Primavera hateoas
  • Primavera di sicurezza

Sto cercando di creare un User entità. Voglio che l'utente abbia una password criptata (+ sale).

Quando faccio POST a /api/users ho creato con successo un nuovo utente.

{ 
"firstname":"John", 
"lastname":"Doe", 
"email":"[email protected]", 
"password":"12345678" 
} 

Ma ho 2 problemi:

  • la password viene salvata in chiaro
  • il sale è nullo
+----+---------------------+-----------+----------+----------+------+ 
| id |  email  | firstname | lastname | password | salt | 
+----+---------------------+-----------+----------+----------+------+ 
| 1 | [email protected] | John  | Doe  | 12345678 | NULL | 
+----+---------------------+-----------+----------+----------+------+ 

il problema che ho pensa che venga utilizzato il costruttore predefinito e non l'altro che ho creato. Sono nuovo di Primavera e JPA quindi mi manca qualcosa. Ecco il mio codice.

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); 
    } 

} 

anche se s qualcuno trova ciò che ho fatto di sbagliato, vorrei indicarmi dove/come dovrei inserire il codice di accesso dell'utente (decrittografia).

Grazie.

+0

dov'è il tuo REST @RestController? – Makoton

+0

@Makoton non ne ho uno. Spring Data Rest espone automaticamente le mie entità in un'API RESTful. Ne ho bisogno uno in questo caso? –

+0

e hai provato a creare un UserService e: public void registerUser (utente finale utente) { final String encodedPassword = passwordEncoder.encode (user.getPassword()); user.setPassword (encodedPassword); userRepo.save (utente); } – Makoton

risposta

3

Quindi, ecco come ho risolto il problema: ho creato un controller come endpoint personalizzato e poi ho creato un servizio in cui ho inserito la logica che volevo per la creazione dell'utente.Ecco il codice:

UserController.java

@Controller 
public class UserController { 

    @Autowired 
    private UserService userService; 

    @RequestMapping("/api/register") 
    @ResponseBody 
    public Long register(@RequestBody User user) { 
     return userService.registerUser(user); 
    } 

    ... 

} 

UserService .java

@Service 
public class UserService { 

    @Autowired 
    private UserRepository userRepository; 

    public Long registerUser(User user) { 
     user.setPassword(new BCryptPasswordEncoder().encode(password)); 
     userRepository.save(user); 
     return user.getId(); 
    } 

     ... 

} 

così facendo una POST con

{ 
"firstname":"John", 
"lastname":"Doe", 
"email":"[email protected]", 
"password":"12345678" 
} 

a /api/register, ora posso creare un utente con una password con hash.

2

Se si desidera Primavera di utilizzare il costruttore, è necessario

  • rimuovere il costruttore senza argomenti
  • annotare tutti i parametri in un altro costruttore con @JsonProperty come questo
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); 
} 

Non è necessario fornire un valore di sale per BCryptPasswordEncoder perché è già ady salts password da solo.

+0

Come si fa quando uno degli argomenti è un riferimento a un'altra entità? È possibile utilizzare @JsonProperty? – aycanadal