מדריך ל- AuthenticationManagerResolver באבטחת אביב

1. הקדמה

במדריך זה אנו מציגים AuthenticationManagerResolver ואז הראה כיצד להשתמש בו לזרמי אימות בסיסי ו- OAuth2.

2. מה זה AuthenticationManager?

במילים פשוטות, ה AuthenticationManager הוא ממשק האסטרטגיה העיקרי לאימות.

אם מנהל אימות הקלט תקף ומאומת, AuthenticationManager # authenticate מחזירה אימות למשל עם מְאוּמָת דגל מוגדר ל נָכוֹן. אחרת, אם המנהל אינו תקף, הוא יזרוק AuthenticationException. במקרה האחרון הוא חוזר ריק אם זה לא יכול להחליט.

ProviderManager הוא יישום ברירת המחדל של AuthenticationManager. הוא מאציל את תהליך האימות לרשימה של אימות ספק מקרים.

אנחנו יכולים להגדיר גלובלי או מקומי AuthenticationManager אם נאריך מתאם WebSecurityConfigurer. למקומי AuthenticationManager, נוכל לעקוף הגדר (AuthenticationManagerBuilder).

AuthenticationManagerBuilder הוא מעמד עוזר שמקל על ההקמה של UserDetailService, אימות ספקותלות אחרות לבנות AuthenticationManager.

עבור גלובלי AuthenticationManagerעלינו להגדיר AuthenticationManager כשעועית.

3. מדוע AuthenticationManagerResolver?

AuthenticationManagerResolver מאפשר לאביב לבחור AuthenticationManager לכל הקשר. זו תכונה חדשה שנוספה ל- Spring Security בגרסה 5.2.0:

ממשק ציבורי AuthenticationManagerResolver {AuthenticationManager resolution (הקשר C); }

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

אביב ביטחון שילבה את AuthenticationManagerResolver באימות זרימה עם HttpServletRequest ו Exchange Server Exchange כהקשר.

4. תרחיש שימוש

בואו נראה כיצד להשתמש AuthenticationManagerResolver בפועל.

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

5. איך עושה AuthenticationManagerResolver עֲבוֹדָה?

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

ראשית, בואו נקבע AuthenticationManagerResolverואז השתמש בו לאימות בסיסי ו- OAuth2.

5.1. מגדיר AuthenticationManagerResolver

נתחיל ביצירת מחלקה לתצורת אבטחה. עלינו להאריך מתאם WebSecurityConfigurer:

@Configuration מחלקה ציבורית CustomWebSecurityConfigurer מרחיב את WebSecurityConfigurerAdapter {// ...}

לאחר מכן, בואו להוסיף שיטה שמחזירה את ה- AuthenticationManager ללקוחות:

AuthenticationManager clientsAuthenticationManager () {החזרת אימות -> {if (isCustomer (authentication)) {החזרת שם משתמש חדש PasswordWeuthenticationToken (/ * אישורים * /); } לזרוק שם משתמש חדשNotFoundException (/ * שם ראשי * /); }; }

ה AuthenticationManager עבור העובדים זהה מבחינה לוגית, רק אנחנו מחליפים isCustomer עם הוא עובד:

עובדי AuthenticationManager ציבוריים AuthenticationManager () {החזרת אימות -> {if (isEmployee (אימות)) {החזרת שם משתמש חדש Password PasswordAuthenticationToken (/ * אישורים * /); } זרק שם משתמש חדשNotFoundException (/ * שם ראשי * /); }; }

לסיום, בואו נוסיף AuthenticationManagerResolver שנפתר לפי כתובת ה- URL של הבקשה:

AuthenticationManagerResolver resolver () {return request -> {if (request.getPathInfo (). StartsWith ("/ עובד")) {return workersAuthenticationManager (); } להחזיר לקוחותAuthenticationManager (); }; }

5.2. לאימות בסיסי

אנחנו יכולים להשתמש AuthenticationFilter כדי לפתור באופן דינמי את AuthenticationManager לפי בקשה. AuthenticationFilter נוספה ל- Spring Security בגרסה 5.2.

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

ראשית, בואו להוסיף שיטה שלנו CustomWebSecurityConfigurer ליצור AuthenticationFilter:

פרטי AuthenticationFilter authenticationFilter () {AuthenticationFilter filter = AuthenticationFilter חדש (resolver (), authenticationConverter ()); filter.setSuccessHandler ((בקשה, תגובה, אימות) -> {}); מסנן החזרה; }

הסיבה להגדרת ה- AuthenticationFilter # successHandler עם אי-אופ SuccessHandler היא למנוע התנהגות ברירת מחדל של ניתוב מחדש לאחר אימות מוצלח.

לאחר מכן, אנו יכולים להוסיף מסנן זה לשרשרת מסנני האבטחה שלנו על ידי עקיפה WebSecurityConfigurerAdapter # configure (HttpSecurity) בשלנו CustomWebSecurityConfigurer:

התצורה הריקה מוגנת של @Override (HttpSecurity http) זורקת חריג {http.addFilterBefore (authenticationFilter (), BasicAuthenticationFilter.class); }

5.3. לאימות OAuth2

BearerTokenAuthenticationFilter אחראי על אימות OAuth2. ה BearerTokenAuthenticationFilter # doFilterInternal שיטת בדיקות א BearerTokenAuthenticationToken בבקשה, ואם היא זמינה, היא פותרת את המתאים AuthenticationManager כדי לאמת את האסימון.

OAuth2ResourceServerConfigurer משמש להגדרה BearerTokenAuthenticationFilter.

אז נוכל להגדיר AuthenticationManagerResolver עבור שרת המשאבים שלנו ב CustomWebSecurityConfigurer על ידי עקיפה WebSecurityConfigurerAdapter # configure (HttpSecurity):

התצורה הריקה המוגנת של @Override (HttpSecurity http) זורקת חריג {http .oauth2ResourceServer () .authenticationManagerResolver (resolver ()); }

6. לפתור AuthenticationManager ביישומים תגובתי

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

ממשק ציבורי @FunctionalInterface ReactiveAuthenticationManagerResolver {פתרון מונו (הקשר C); }

זה מחזיר א מונו שֶׁל ReactiveAuthenticationManager. ReactiveAuthenticationManager הוא המקבילה התגובתית ל- AuthenticationManagerומכאן שלה לְאַמֵת השיטה מחזירה מונו.

6.1. מגדיר ReactiveAuthenticationManagerResolver

נתחיל ביצירת מחלקה לתצורת אבטחה:

@EnableWebFluxSecurity @EnableReactiveMethodSecurity מחלקה ציבורית CustomWebSecurityConfig {// ...}

לאחר מכן, בואו נגדיר ReactiveAuthenticationManager ללקוחות בכיתה זו:

ReactiveAuthenticationManager clientsAuthenticationManager () {return authentication -> customer (authentication) .switchIfEmpty (Mono.error (new UsernameNotFoundException (/ * name principal * /))) .map (b -> new UsernamePasswordAuthenticationToken (/ * credentials * /); } 

ואחרי זה נגדיר ReactiveAuthenticationManager לעובדים:

ציבורי ReactiveAuthenticationManagerAuthenticationManager () {החזרת אימות -> עובד (אימות) .switchIfEmpty (Mono.error (new UsernameNotFoundException (/ * name main * /))) .map (b -> new UsernamePasswordAuthenticationToken (/ * credentials * /); }

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

רזולטיבי ReactiveAuthenticationManagerResolver () {להחזיר תשואה -> {if (match (exchange.getRequest (), "/ עובד")) {להחזיר Mono.just (workersAuthenticationManager ()); } להחזיר Mono.just (clientsAuthenticationManager ()); }; }

6.2. לאימות בסיסי

באפליקציית רשת תגובתי אנו יכולים להשתמש בה AuthenticationWebFilter לאימות. זה מאמת את הבקשה וממלא את הקשר האבטחה.

AuthenticationWebFilter בודק תחילה אם הבקשה תואמת. לאחר מכן, אם יש אובייקט אימות בבקשה, הוא מקבל את המתאים ReactiveAuthenticationManager לבקשה מאת ReactiveAuthenticationManagerResolver וממשיך את זרימת האימות.

לפיכך, אנו יכולים להגדיר את ההתאמה האישית שלנו AuthenticationWebFilter בתצורת האבטחה שלנו:

@Bean SecurityWebFilterChain ציבורי securityWebFilterChain (ServerHttpSecurity http) {להחזיר http .authorizeExchange () .pathMatchers ("/ **"). מאומת () .and () .httpBasic (). Disable () .addFilterAfter (רישום חדש לאימות ((AuthenticationWebFilter) ), SecurityWebFiltersOrder.REACTOR_CONTEXT) .build (); }

ראשית, אנו משביתים ServerHttpSecurity # httpBasic כדי למנוע את זרימת האימות הרגילה, ואז החלף אותו ידנית ב- AuthenticationWebFilter, מעביר את הרזולר המותאם אישית שלנו.

6.3. לאימות OAuth2

אנחנו יכולים להגדיר את ReactiveAuthenticationManagerResolver עם ServerHttpSecurity # oauth2ResourceServer. ServerHttpSecurity # build מוסיף מופע של AuthenticationWebFilter עם הפותר שלנו לשרשרת מסנני האבטחה.

אז בואו נקבע את שלנו AuthenticationManagerResolver למסנן אימות OAuth2 בתצורת האבטחה שלנו:

@Bean Security SecurityWebFilterChain securityWebFilterChain (ServerHttpSecurity http) {return http // ... .and () .oauth2ResourceServer () .authenticationManagerResolver (resolver ()) .and () // ...; }

7. מסקנה

במאמר זה השתמשנו AuthenticationManagerResolver לאימות בסיסי ו- OAuth2 בתרחיש פשוט.

וכן בחנו את השימוש ב- ReactiveAuthenticationManagerResolver ביישומי רשת אביב ריאקטיביים עבור אימות בסיסי ו- OAuth2.

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


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