מדריך למושב האביב

REST למעלה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

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

מושב אביב מטרתו הפשוטה לפנות את ניהול ההפעלות מהמגבלות של הפעלת HTTP המאוחסנת בשרת.

הפיתרון מקל על שיתוף נתוני הפעלות בין שירותים בענן מבלי להיות קשור למכולה אחת (כלומר Tomcat). בנוסף, הוא תומך במספר הפעלות באותו דפדפן ושליחת הפעלות בכותרת.

במאמר זה נשתמש מושב אביב לניהול פרטי אימות באפליקציית אינטרנט. בזמן מושב אביב אנו יכולים להשתמש בנתונים באמצעות JDBC, Gemfire או MongoDB רדיס.

למבוא ל רדיס עיין במאמר זה.

2. פרויקט פשוט

בואו ראשית ליצור פשוט מגף אביב פרויקט שישמש כבסיס לדוגמאות ההפעלה שלנו בהמשך:

 org.springframework.boot spring-boot-starter-parent 2.2.6.RELEASE org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot- מבחן מבחן התחלה 

היישום שלנו פועל עם מגף אביב ו- pom parent מספק גרסאות לכל ערך. הגרסה האחרונה של כל תלות תמצאו כאן: קפיץ-אתחול-אבטחה, קפיץ-אתחול-רשת, קפיץ-אתחול-מבחן-מבחן.

בואו להוסיף גם כמה מאפייני תצורה עבור שרת Redis שלנו application.properties:

spring.redis.host = localhost spring.redis.port = 6379

3. תצורת אתחול האביב

למגף האביב, זה מספיק כדי להוסיף את התלות הבאותוהתצורה האוטומטית תדאג לשאר:

 org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis 

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

4. תצורת אביב סטנדרטית (ללא מגף)

בואו נסתכל גם על השילוב וההגדרה אביב-מושב בלי מגף קפיץ - רק עם קפיץ פשוט.

4.1. תלות

ראשית, אם אנו מוסיפים אביב-מושב לפרויקט אביב סטנדרטי, נצטרך להגדיר במפורש:

 org.springframework.session spring-session 1.2.2.RELEASE org.springframework.data spring-data-redis 1.5.0.RELEASE 

הגרסאות העדכניות ביותר של המודולים הללו ניתן למצוא כאן: spring-session, spring-data-redis.

4.2. תצורת מושב האביב

עכשיו בואו נוסיף מחלקת תצורה עבור מושב אביב:

@Configuration @EnableRedisHttpSession מחלקה ציבורית SessionConfig מרחיב AbstractHttpSessionApplicationInitializer {@Bean הציבור JedisConnectionFactory connectionFactory () {להחזיר JedisConnectionFactory חדש (); }}

@EnableRedisHttpSession והרחבה של תקציר HttpSessionApplicationInitializer תיצור ותחבר פילטר מול כל תשתית האבטחה שלנו כדי לחפש הפעלות אקטיביות ולאכלס את הקשר האבטחה מערכים המאוחסנים ב- רדיס.

בואו נשלים את היישום הזה עם בקר ותצורת האבטחה.

5. תצורת יישום

נווט לקובץ היישום הראשי שלנו והוסף בקר:

@RestController מחלקה ציבורית SessionController {@RequestMapping ("/") ציבורי מחרוזת helloAdmin () {להחזיר "שלום מנהל"; }}

זה ייתן לנו נקודת סיום לבדיקה.

לאחר מכן, הוסף את מחלקת תצורת האבטחה שלנו:

@Configuration @EnableWebSecurity המחלקה הציבורית SecurityConfig מרחיב את WebSecurityConfigurerAdapter {@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) זורק חריג {auth .inMemoryAuthentication () .withUser ("admin"). סיסמה (סיסמה קוד). ("מנהל"); } התצורה הריקה המוגנת על ידי @Override (HttpSecurity http) זורקת חריג {http .httpBasic (). ו- () .authorizeRequests () .antMatchers ("/"). HasRole ("ADMIN") .anyRequest (). מאומת (); } @Bean סיסמא ציבורית Encoder סיסמא Encoder () {להחזיר BCryptPasswordEncoder חדש (); }}

זה מגן על נקודות הקצה שלנו באמצעות אימות בסיסי ומגדיר משתמש לבדיקה.

6. מבחן

לסיום, בואו נבדוק הכל - נגדיר כאן מבחן פשוט שיאפשר לנו לעשות 2 דברים:

  • לצרוך את יישום האינטרנט החי
  • לדבר עם רדיס

בואו נקדים את הדברים:

מעמד ציבורי SessionControllerTest {ג'דיס פרטיות; TestRestTemplate פרטי testRestTemplate; TestRestTemplate פרטי testRestTemplateWithAuth; מחרוזת פרטית testUrl = "// localhost: 8080 /"; @ לפני הריק הציבורי clearRedisData () {testRestTemplate = TestRestTemplate חדש (); testRestTemplateWithAuth = TestRestTemplate חדש ("admin", "password", null); ג'דיס = ג'דיס חדש ("localhost", 6379); jedis.flushAll (); }}

שימו לב כיצד אנו מגדירים את שני הלקוחות הללו - לקוח ה- HTTP וה- Redis. כמובן שבשלב זה השרת (ורדיס) צריכים להיות פועלים - כדי שנוכל לתקשר איתם באמצעות הבדיקות הללו.

נתחיל בבדיקה זו רדיס זה ריק:

@ מבחן בטל פומבי testRedisIsEmpty () {Set result = jedis.keys ("*"); assertEquals (0, result.size ()); }

עכשיו בדוק שהאבטחה שלנו מחזירה 401 לבקשות לא מאומתות:

@Test מבטל בטל ציבורי UnnauthenticatedCantAccess () {ResponseEntity result = testRestTemplate.getForEntity (testUrl, String.class); assertEquals (HttpStatus.UNAUTHORIZED, result.getStatusCode ()); }

לאחר מכן, אנו בודקים זאת מושב אביב מנהל את אסימון האימות שלנו:

@Test בטל ציבורי testRedisControlsSession () {ResponseEntity result = testRestTemplateWithAuth.getForEntity (testUrl, String.class); assertEquals ("שלום מנהל", result.getBody ()); // הכניסה עבדה הגדר redisResult = jedis.keys ("*"); assertTrue (redisResult.size ()> 0); // redis מאוכלס בנתוני הפעלות String sessionCookie = result.getHeaders (). get ("Set-Cookie"). get (0) .split (";") [0]; כותרות HttpHeaders = HttpHeaders חדשות (); headers.add ("עוגיה", sessionCookie); HttpEntity httpEntity = HttpEntity חדש (כותרות); תוצאה = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals ("שלום מנהל", result.getBody ()); // גישה עם עבודות הפעלה עבד jedis.flushAll (); // נקה את כל המקשים בתוצאה של redis = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals (HttpStatus.UNAUTHORIZED, result.getStatusCode ()); // הגישה נדחתה לאחר הסרת הפעלות מחדש.

ראשית, הבדיקה שלנו מאשרת כי בקשתנו הצליחה באמצעות אישורי אימות מנהל.

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

לבסוף, אנו מגישים בקשה נוספת באמצעות קובץ ה- cookie של ההפעלה ומאשרים כי התנתקנו. זה מאשר את זה מושב אביב מנהל את המפגשים שלנו.

7. מסקנה

מושב אביב הוא כלי רב עוצמה לניהול הפעלות HTTP. עם אחסון ההפעלות שלנו לפשט לכיתת תצורה ולכמה תלות של Maven, כעת אנו יכולים לחבר מספר יישומים לאותו דבר רדיס למשל ולשתף מידע על אימות.

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

REST תחתון

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

$config[zx-auto] not found$config[zx-overlay] not found