אימות במגף האביב

1. סקירה כללית

בכל הנוגע לאימות קלט משתמשים, Spring Boot מספק תמיכה חזקה במשימה נפוצה, אך קריטית, ישירות מהקופסה.

למרות ש- Spring Boot תומך בשילוב חלק עם מאמתים מותאמים אישית, הסטנדרט דה-פקטו לביצוע אימות הוא Validator Hibernate, יישום הפניה למסגרת אימות השעועית.

במדריך זה, נבדוק כיצד לאמת אובייקטים של תחומים ב- Spring Boot.

2. התלות של Maven

במקרה זה נלמד כיצד לאמת אובייקטים של תחומים ב- Spring Boot על ידי בניית בקר REST בסיסי.

הבקר ייקח תחילה אובייקט תחום, ואז יאמת אותו באמצעות Hibernate Validator, ולבסוף הוא ימשיך אותו למסד נתונים H2 בזיכרון.

התלות של הפרויקט סטנדרטית למדי:

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 1.4.197 זמן ריצה 

כפי שמוצג לעיל, כללנו קפיץ-אתחול-רשת בשלנו pom.xml קובץ כי נצטרך אותו ליצירת בקר ה- REST. בנוסף, בואו נדאג לבדוק את הגרסאות העדכניות ביותר של אביב-אתחול-המתנע-jpa ואת מסד הנתונים H2 ב- Maven Central.

החל מ- Boot 2.3, עלינו להוסיף במפורש את ה- אביב-אתחול-סטרטר-אימות תלות:

 org.springframework.boot אביב-אתחול-סטרטר-אימות 

3. מעמד תחום פשוט

כאשר התלות של הפרויקט שלנו כבר קיימת, הבא עלינו להגדיר מחלקת ישות JPA לדוגמא, שתפקידה יהיה רק ​​דוגמנות משתמשים.

בואו נסתכל על הכיתה הזו:

משתמש בכיתה ציבורית @Entity {@Id @GeneratedValue (אסטרטגיה = GenerationType.AUTO) מזהה פרטי ארוך; @NotBlank (message = "שם חובה") שם מחרוזת פרטי; @NotBlank (message = "דוא"ל חובה") דוא"ל מחרוזת פרטי; // קונסטרוקטורים סטנדרטיים / סטרים / getters / toString}

היישום של שלנו מִשׁתַמֵשׁ מחלקת ישויות היא אכן אנמית, אך היא מראה בקצרה כיצד להשתמש באילוצים של אימות שעועית בכדי להגביל את שֵׁם ו אימייל שדות.

לשם הפשטות, הגבלנו את שדות היעד באמצעות ה- @NotBlank אילוץ. כמו כן, ציינו את הודעות השגיאה עם ה- הוֹדָעָה תְכוּנָה.

לכן, כאשר Spring Boot מאמת את מופע המחלקה, השדות המוגבלים לא חייב להיות אפס ואורך הגזוז שלהם צריך להיות גדול מאפס.

בנוסף, אימות שעועית מספק אילוצים רבים אחרים מלבדם @NotBlank. זה מאפשר לנו ליישם ולשלב כללי אימות שונים לשיעורים המוגבלים. למידע נוסף אנא קרא את המסמכים הרשמיים לאימות שעועית.

מכיוון שנשתמש ב- Spring Data JPA לשמירת משתמשים במסד הנתונים H2 בזיכרון, עלינו להגדיר ממשק מאגר פשוט עבור פונקציונליות CRUD בסיסית ב- מִשׁתַמֵשׁ חפצים:

ממשק ציבורי @ מאגר @ UserRepository מרחיב את CrudRepository {}

4. הטמעת בקר REST

כמובן, עלינו ליישם שכבה המאפשרת לנו לקבל את הערכים המוקצים שלנו מִשׁתַמֵשׁ שדות מוגבלים של האובייקט.

לכן, אנו יכולים לאמת אותם ולבצע מספר משימות נוספות, בהתאם לתוצאות האימות.

מגף האביב עושה תהליך מורכב לכאורה זה ממש פשוט באמצעות הטמעה של בקר REST.

בואו נסתכל על יישום בקר ה- REST:

@RestController מחלקה ציבורית UserController {@PostMapping ("/ users") ResponseEntity addUser (@Valid @RequestBody User user) {// ממשיך המשתמש להחזיר ResponseEntity.ok ("המשתמש תקף"); } // קונסטרוקציות סטנדרטיות / שיטות אחרות} 

בהקשר REST באביב, יישום ה- הוסף משתמש() השיטה היא די סטנדרטית.

כמובן, החלק הרלוונטי ביותר הוא השימוש ב- @תָקֵף ביאור.

כאשר אביב המגף מוצא טיעון עם ביאור @תָקֵף, הוא מאתחל אוטומטית את יישום JSR 380 המוגדר כברירת מחדל - Hvalnate Validator - ומאמת את הטיעון.

כאשר טיעון היעד לא מצליח לעבור את האימות, Spring Boot זורק a MethodArgumentNotValidException יוצא מן הכלל.

5. ה @ExceptionHandler ביאור

אמנם זה ממש שימושי שיש אתחול האביב מִשׁתַמֵשׁ אובייקט שהועבר ל הוסף משתמש() באופן אוטומטי, ההיבט החסר של תהליך זה הוא כיצד אנו מעבדים את תוצאות האימות.

ה @ExceptionHandler ביאור מאפשר לנו לטפל בסוגי חריגים מוגדרים באמצעות שיטה אחת אחת.

לכן אנו יכולים להשתמש בו לעיבוד שגיאות האימות:

@ResponseStatus (HttpStatus.BAD_REQUEST) @ExceptionHandler (MethodArgumentNotValidException.class) handvat מפה ציבורי ValidationExceptions (MethodArgumentNotValidException ex) {שגיאות מפה = HashMap חדש (); ex.getBindingResult (). getAllErrors (). forEach ((error) -> {String fieldName = ((FieldError) error) .getField (); String errorMessage = error.getDefaultMessage (); errors.put (fieldName, errorMessage); }); שגיאות החזרה; }

ציינו את MethodArgumentNotValidException חריג כחריג שיש לטפל בו. כתוצאה מכך, Spring Boot יקרא לשיטה זו כאשר צוין מִשׁתַמֵשׁ האובייקט אינו תקף.

השיטה מאחסנת את השם ואת הודעת השגיאה לאחר האימות של כל שדה לא חוקי ב- מַפָּה. הבא זה שולח את מַפָּה בחזרה ללקוח כייצוג JSON להמשך עיבוד.

במילים פשוטות, בקר ה- REST מאפשר לנו לעבד בקלות בקשות לנקודות קצה שונות, לאמת מִשׁתַמֵשׁ אובייקטים, ושלח את התגובות בפורמט JSON.

העיצוב גמיש מספיק בכדי לטפל בתגובות בקר דרך כמה שכבות אתרים, החל ממנועי תבניות כגון Thymeleaf וכלה במסגרת JavaScript מלאה הכוללת דוגמת Angular.

6. בדיקת בקר ה- REST

אנו יכולים לבדוק בקלות את הפונקציונליות של בקר ה- REST שלנו באמצעות מבחן אינטגרציה.

נתחיל ללעוג / לחווט אוטומטי את UserRepository יישום ממשק, יחד עם UserController מופע, ו MockMvc לְהִתְנַגֵד:

@RunWith (SpringRunner.class) @WebMvcTest @ AutoConfigureMockMvc מחלקה ציבורית UserControllerIntegrationTest {@MockBean UserRepository פרטי UserRepository; @Autowired UserController userController; @ MockMvc פרטית אוטומטית mockMvc; // ...} 

מכיוון שאנחנו בודקים רק את שכבת האינטרנט, אנו משתמשים ב- @WebMvcTest ביאור. זה מאפשר לנו לבדוק בקשות ותגובות בקלות באמצעות מכלול השיטות הסטטיות המיושמות על ידי MockMvcRequestBuilders ו MockMvcResultMatchers שיעורים.

עכשיו בואו נבדוק את הוסף משתמש() שיטה עם תקף ולא חוקי מִשׁתַמֵשׁ אובייקט שהועבר בגוף הבקשה:

@Test ציבורי בטל כאשר PostRequestToUsersAndValidUser_thenCorrectResponse () זורק חריג {MediaType textPlainUtf8 = MediaType חדש (MediaType.TEXT_PLAIN, Charset.forName ("UTF-8")); משתמש מחרוזת = "{\" שם \ ": \" בוב \ ", \" דוא"ל \ ": \" [דוא"ל מוגן] \ "}"; mockMvc.perform (MockMvcRequestBuilders.post ("/ users") .content (user) .contentType (MediaType.APPLICATION_JSON_UTF8)). andExpect (MockMvcResultMatchers.status (). isOk ()). andExpect (MockMvccontent) textPlainUtf8)); } @Test ציבורי בטל כאשר PostRequestToUsersAndInValidUser_thenCorrectResponse () זורק חריג {משתמש מחרוזת = "{\" שם \ ": \" \ ", \" דוא"ל \ ": \" [מוגן באמצעות דוא"ל] \ "}"; mockMvc.perform (MockMvcRequestBuilders.post ("/ users") .content (user) .contentType (MediaType.APPLICATION_JSON_UTF8)). andExpect (MockMvcResultMatchers.status (). isBadRequest ()) .andExpect (MockM. ", Is.is (" השם חובה "))). ו- Expect (MockMvcResultMatchers.content () .contentType (MediaType.APPLICATION_JSON_UTF8)); }} 

בנוסף, אנו יכולים לבדוק את ממשק ה- API של בקר REST באמצעות יישום בדיקות מחזור חיים של API בחינם, כמו למשל דואר.

7. הפעלת היישום לדוגמא

לבסוף, נוכל להריץ את פרויקט הדוגמה שלנו עם תקן רָאשִׁי() שיטה:

@SpringBootApplication מחלקה ציבורית יישום {public static void main (String [] args) {SpringApplication.run (Application.class, args); } ריצת CommandLineRunner @Bean ציבורית (UserRepository userRepository) זורקת Exception {return (String [] args) -> {User user1 = User new ("Bob", "[email protected]"); משתמש משתמש 2 = משתמש חדש ("ג'ני", "[דוא"ל מוגן]"); userRepository.save (user1); userRepository.save (user2); userRepository.findAll (). forEach (System.out :: println); }; }} 

כצפוי, אנחנו צריכים לראות כמה מִשׁתַמֵשׁ חפצים המודפסים בקונסולה.

בקשת POST אל // localhost: 8080 / נקודת קצה של משתמשים עם תוקף מִשׁתַמֵשׁ אובייקט יחזיר את חוּט "המשתמש תקף".

כמו כן, בקשת POST עם מִשׁתַמֵשׁ חפץ בלי שֵׁם ו אימייל ערכים יחזירו את התגובה הבאה:

{"name": "שם חובה", "email": "דוא"ל הוא חובה"}

8. מסקנה

במאמר זה, למדנו את היסודות של ביצוע אימות ב- Spring Boot.

כרגיל, כל הדוגמאות המוצגות במאמר זה זמינות באתר GitHub.