2015-07-14 17 views
5

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.

+0

gdzie jest Twój REST @RestController? – Makoton

+0

@Makoton nie mam. Spring Data Rest automatycznie eksponuje moje jednostki w RESTful API. Czy w takim przypadku potrzebuję jednego? –

+0

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

Odpowiedz

3

Oto, w jaki sposób rozwiązałem mój problem: stworzyłem kontroler jako mój niestandardowy punkt końcowy, a następnie utworzyłem usługę, w której umieściłem logikę, którą chciałem dla stworzenia użytkownika.Oto kod:

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

     ... 

} 

więc wykonując POST z

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

w /api/register, mogę teraz utworzyć użytkownika z hashowanym hasłem.

2

Jeśli chcesz Wiosna używać konstruktora, trzeba

  • usunąć konstruktora bez argumentu
  • opisywanie każdego parametru w drugim konstruktora z @JsonProperty jak ten
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); 
} 

Nie musisz podawać wartości soli do BCryptPasswordEncoder, ponieważ jest za późno samymi hasłami soli.

+0

Jak zrobić, gdy jeden z argumentów jest odniesieniem do innej jednostki? Czy można wtedy użyć @JsonProperty? – aycanadal