אבטחת אביב: אימות באמצעות UserDetailsService מגובה מסד נתונים

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

במאמר זה נראה כיצד ליצור מסד נתונים המותאם אישית המותאם אישית UserDetailsService לאימות עם Spring Security.

2. UserDetailsService

ה UserDetailsService ממשק משמש לאחזור נתונים הקשורים למשתמש. יש לה שיטה אחת בשם loadUserByUsername () אשר ניתן לעקוף כדי להתאים אישית את תהליך מציאת המשתמש.

הוא משמש את DaoAuthenticationProvider לטעינת פרטים אודות המשתמש במהלך האימות.

3. ה מִשׁתַמֵשׁ דֶגֶם

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

משתמש בכיתה ציבורית @Entity {@Id @GeneratedValue (אסטרטגיה = GenerationType.AUTO) פרטי מזהה ארוך; @Column (nullable = false, unique = true) שם משתמש מחרוזת פרטי; סיסמת מחרוזת פרטית; // סטרים וקובעים סטנדרטיים}

4. אחזור משתמש

לצורך אחזור משתמש המשויך לשם משתמש, ניצור DAO בשיעור באמצעות נתוני אביב על ידי הרחבת ה- מאגר Jpa מִמְשָׁק:

ממשק ציבורי UserRepository מרחיב את JpaRepository {User findByUsername (שם משתמש מחרוזת); }

5. ה UserDetailsService

על מנת לספק שירות משתמשים משלנו, נצטרך ליישם את ה- UserDetailsService מִמְשָׁק.

ניצור שיעור שנקרא MyUserDetailsService שעוקף את השיטה loadUserByUsername () של הממשק.

בשיטה זו אנו מאחזרים את ה- מִשׁתַמֵשׁ אובייקט באמצעות DAO, ואם הוא קיים, עטוף אותו לא MyUserPrincipal אובייקט, אשר מיישם פרטי המשתמשומחזיר אותו:

המחלקה הציבורית @Service MyUserDetailsService מיישמת את UserDetailsService {@Autowired פרטי UserRepository userRepository; @Override UserDetails ציבורי loadUserByUsername (שם משתמש מחרוזת) {User user = userRepository.findByUsername (שם משתמש); אם (user == null) {זרוק UsernameNotFoundException חדש (שם משתמש); } להחזיר MyUserPrincipal חדש (משתמש); }}

בואו נגדיר את MyUserPrincipal כיתה כדלקמן:

מחלקה ציבורית MyUserPrincipal מיישם UserDetails {משתמש פרטי פרטי; MyUserPrincipal ציבורי (משתמש משתמש) {this.user = משתמש; } // ...}

6. תצורת אביב

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

6.1. תצורת ההערה

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

מאז הגדרנו את הכיתה שלנו עם ה- @שֵׁרוּת ביאור, היישום יאתר זאת אוטומטית במהלך סריקת רכיבים, והוא ייצור שעועית מחוץ למחלקה זו. לכן, אין שום דבר אחר שעלינו לעשות כאן.

לחלופין, אנו יכולים:

  • להגדיר את זה ב authenticationManager משתמש ב AuthenticationManagerBuilder # userDetailsService שיטה
  • הגדר אותו כמאפיין במנהג אימות ספק שעועית ואז הזריק אותה באמצעות AuthenticationManagerBuilder # authenticationProvider פוּנקצִיָה

6.2. תצורת XML

מצד שני, עבור תצורת ה- XML ​​עלינו להגדיר שעועית עם סוג MyUserDetailsService, ולהזריק אותו לאביב ספק אימות אפונה:

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

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

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

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

ה JdbcUserDetailsManager הישות הנובעת מתצורה זו מיישמת את UserDetailsService גַם.

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

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

8. מסקנה

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

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