2015-07-14 13 views
5

मैं वसंत सीखने की कोशिश कर रहा हूं।वसंत बूट डेटा आराम जेपीए - इकाई कस्टम निर्माण (उपयोगकर्ता)

  • स्प्रिंग डाटा जेपीए
  • स्प्रिंग डाटा बाकी
  • स्प्रिंग HATEOAS
  • स्प्रिंग सुरक्षा

मैं एक User बनाने के लिए कोशिश कर रहा हूँ: मैं निम्नलिखित उपकरण का उपयोग कर स्प्रिंग बूट के साथ एक परियोजना बनाई इकाई। मैं चाहता हूं कि उपयोगकर्ता को एन्क्रिप्टेड पासवर्ड (+ नमक) हो।

जब मैं POST/api/users पर सफलतापूर्वक एक नया उपयोगकर्ता बना देता हूं।

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

लेकिन मैं 2 समस्या है:

  • पासवर्ड स्पष्ट पाठ में सहेजा गया है
  • नमक रिक्त है
+----+---------------------+-----------+----------+----------+------+ 
| id |  email  | firstname | lastname | password | salt | 
+----+---------------------+-----------+----------+----------+------+ 
| 1 | [email protected] | John  | Doe  | 12345678 | NULL | 
+----+---------------------+-----------+----------+----------+------+ 
समस्या मैं

सोचो कि डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग किया जाता है और दूसरा नहीं जिसे मैंने बनाया है। मैं वसंत और जेपीए के लिए नया हूं इसलिए मुझे कुछ याद आना चाहिए। मेरा कोड यहाँ है।

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

} 
इसके अलावा, अगर रों

ओमेन ने पाया कि मैंने क्या गलत किया है, मैं मुझे इंगित करना चाहता हूं कि मुझे उपयोगकर्ता लॉगिन कोड (डिक्रिप्शन) कहां रखना चाहिए।

धन्यवाद।

+0

आपका आरईएसटी @ रीस्ट कंट्रोलर कहां है? – Makoton

+0

@Makoton मेरे पास एक नहीं है। स्प्रिंग डेटा रेस्ट स्वचालित रूप से एक वास्तविक API में मेरी इकाइयों को उजागर करता है। क्या मुझे इस मामले में एक की जरूरत है? –

+0

और आपने उपयोगकर्ता सेवा बनाने का प्रयास किया और: सार्वजनिक शून्य रजिस्टर उपयोगकर्ता (अंतिम उपयोगकर्ता उपयोगकर्ता) { अंतिम स्ट्रिंग एन्कोडेड पासवर्ड = पासवर्डइन्कोडर.नकोड (user.getPassword()); user.setPassword (एन्कोडेड पासवर्ड); userRepo.save (उपयोगकर्ता); } – Makoton

उत्तर

3

तो, यहां बताया गया है कि मैंने अपनी समस्या का समाधान कैसे किया: मैंने अपने कस्टम एंडपॉइंट के रूप में एक नियंत्रक बनाया और फिर मैंने एक सेवा बनाई जिसमें मैंने तर्क को रखा जो मैं उपयोगकर्ता के निर्माण के लिए चाहता था।में एक POST

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

करके

@Controller 
public class UserController { 

    @Autowired 
    private UserService userService; 

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

    ... 

} 

UserService जावा

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

     ... 

} 

तो

UserController.java: यहाँ कोड है, अब मैं एक हैश पासवर्ड वाला उपयोगकर्ता बना सकता हूं।

2

आप वसंत अपने निर्माता का उपयोग करना चाहते हैं, तो आप

  • कोई तर्क निर्माता इस
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); 
} 
तरह @JsonProperty के साथ अन्य निर्माता में
  • व्याख्या हर पैरामीटर हटाने की जरूरत

    आपको BCryptPasswordEncoder पर नमक मान प्रदान करने की आवश्यकता नहीं है क्योंकि यह बहुत कम है अपने आप से ady नमक पासवर्ड।

  • +0

    जब आप तर्कों में से कोई एक अन्य इकाई का संदर्भ है तो आप कैसे करते हैं? क्या @JsonProperty का उपयोग किया जा सकता है? – aycanadal

    संबंधित मुद्दे