ספקי אימות מרובים באבטחת אביב

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

במאמר מהיר זה, אנו נתמקד בשימוש במנגנונים מרובים לאימות משתמשים באביב אבטחה.

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

2. ספקי אימות

An אימות ספק הוא הפשטה לאיסוף מידע משתמש ממאגר ספציפי (כמו מסד נתונים, LDAP, מקור צד שלישי מותאם אישית וכו '). הוא משתמש במידע המשתמש שנאסף כדי לאמת את האישורים שסופקו.

במילים פשוטות, כאשר מוגדרים ספקי אימות מרובים, הספקים ייחקרו בסדר שהם הוכרזו.

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

3. תלות Maven

בואו תחילה נוסיף את תלות אבטחת האביב הנחוצה ליישום האינטרנט שלנו:

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security 

ובלי מגף קפיץ:

 org.springframework.security spring-security-web 5.2.2.RELEASE org.springframework.security spring-security-core 5.2.2.RELEASE org.springframework.security spring-security-config 5.2.2.RELEASE 

את הגרסה האחרונה של תלות אלה ניתן למצוא באביב-אבטחה-רשת, באביב-אבטחה-ליבת ובאביב-אבטחה-תצורה.

4. ספק אימות מותאם אישית

בואו ניצור כעת ספק אימות מותאם אישית על ידי יישום ה- AuthneticationProvider מִמְשָׁק.

אנחנו הולכים ליישם את לְאַמֵת שיטה - המנסה את האימות. הקלט אימות האובייקט מכיל את שם המשתמש ואת אישורי הסיסמה שמספק המשתמש.

ה לְאַמֵת השיטה מחזירה אוכלוסייה מלאה אימות התנגד אם האימות הצליח. אם האימות נכשל, זה יוצא חריג מסוג AuthenticationException:

מחלקה ציבורית @Component CustomAuthenticationProvider מיישם AuthenticationProvider {@Override Authentication Authentication (Authentication Authentic) זורק AuthenticationException {String שם משתמש = auth.getName (); סיסמת מחרוזת = auth.getCredentials () .toString (); אם ("eksternuser" .equals (שם משתמש) && "לעבור" .equals (סיסמה)) {להחזיר שם משתמש חדשPasswordAuthenticationToken (שם משתמש, סיסמה, Collections.emptyList ()); } אחר {זרוק BadCredentialsException חדש ("אימות המערכת החיצונית נכשל"); }} @Override תומך בוליאני ציבורי (Authentic Class) {להחזיר auth.equals (UsernamePasswordAuthenticationToken.class); }}

מטבע הדברים, זהו יישום פשוט לצורך הדוגמה שלנו כאן.

5. קביעת תצורה של ספקי אימות מרובים

בואו כעת נוסיף את CustomAuthenticationProvider וספק אימות בזיכרון לתצורת Spring Security שלנו.

5.1. תצורת Java

במחלקת התצורה שלנו, בואו ניצור כעת ונוסיף את ספקי האימות באמצעות ה- AuthenticationManagerBuilder.

קודם ה CustomAuthenticationProvider ואז, ספק אימות בזיכרון באמצעות inMemoryAuthentication ().

אנו גם דואגים שהגישה לדפוס כתובת האתר "/ api / **צריך לאמת:

@EnableWebSecurity מחלקה ציבורית MultipleAuthProvidersSecurityConfig מרחיב את WebSecurityConfigurerAdapter {@Autowired CustomAuthenticationProvider customAuthProvider; תצורת הריקות הציבורית של @Override (AuthenticationManagerBuilder auth) זורקת Exception {auth.authenticationProvider (customAuthProvider); auth.inMemoryAuthentication () .withUser ("memuser"). סיסמה (מקודד (). encode ("pass")) .roles ("USER"); } תצורת הריק המוגנת על ידי @Override (HttpSecurity http) זורקת חריג {http.httpBasic () .and () .authorizeRequests () .antMatchers ("/ api / **"). מאומת (); } @Bean סיסמא ציבורית Encoder סיסמא Encoder () {להחזיר BCryptPasswordEncoder חדש (); }}

5.2. תצורת XML

לחלופין, אם אנו רוצים להשתמש בתצורת XML במקום בתצורת Java:

6. היישום

לאחר מכן, בואו ליצור נקודת קצה פשוטה של ​​REST שמאובטחת על ידי שני ספקי האימות שלנו.

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

@RestController מחלקה ציבורית MultipleAuthController {@GetMapping ("/ api / ping") ציבורי מחרוזת getPing () {להחזיר "אישור"; }}

7. בדיקות

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

@Autowired פרטי TestRestTemplate restTemplate; @Test ציבור בטל givenMemUsers_whenGetPingWithValidUser_thenOk () {ResponseEntity result = makeRestCallToGetPing ("memuser", "pass"); assertThat (result.getStatusCodeValue ()). isEqualTo (200); assertThat (result.getBody ()). isEqualTo ("בסדר"); } @Test ציבור בטל שניתןExternalUsers_whenGetPingWithValidUser_thenOK () {ResponseEntity result = makeRestCallToGetPing ("משתמש חיצוני", "לעבור"); assertThat (result.getStatusCodeValue ()). isEqualTo (200); assertThat (result.getBody ()). isEqualTo ("בסדר"); } @Test ציבורי בטל givenAuthProviders_whenGetPingWithNoCred_then401 () {ResponseEntity result = makeRestCallToGetPing (); assertThat (result.getStatusCodeValue ()). isEqualTo (401); } @Test ציבורי בטל givenAuthProviders_whenGetPingWithBadCred_then401 () {ResponseEntity result = makeRestCallToGetPing ("user", "bad_password"); assertThat (result.getStatusCodeValue ()). isEqualTo (401); } ResponseEntity פרטית makeRestCallToGetPing (שם משתמש מחרוזת, סיסמת מחרוזת) {return restTemplate.withBasicAuth (שם משתמש, סיסמה) .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); } ResponseEntity פרטית makeRestCallToGetPing () {return restTemplate .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); }

8. מסקנה

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

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

כמו תמיד, ניתן למצוא את קוד המקור המלא של היישום ב- GitHub.


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