אבטחת אביב: חקר אימות JDBC

עליון התמדה

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

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

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

במדריך קצר זה נחקור את היכולות המוצעות על ידי אביב לביצוע אימות JDBC באמצעות קיים מקור מידע תְצוּרָה.

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

הפעם נשתמש ב- AuthenticationManagerBuilder # jdbc אימות הנחיה לניתוח היתרונות והחסרונות בגישה פשוטה זו.

2. שימוש בחיבור H2 משובץ

קודם כל ננתח כיצד נוכל להשיג אימות באמצעות בסיס נתונים H2 מוטבע.

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

2.1. תלות ותצורת מסד נתונים

נתחיל מלבצע את ההוראות של פוסט האביב הקודם שלנו עם מסד H2 כדי:

  1. כלול את המקביל spring-boot-starter-data-jpa ו h2 תלות
  2. הגדר את חיבור מסד הנתונים עם מאפייני היישום
  3. אפשר את קונסולת H2

2.2. קביעת תצורה של אימות JDBC

נשתמש באביב ביטחון AuthenticationManagerBuilder עוזר תצורה להגדרת אימות JDBC:

@ מקור נתונים פרטי של נתונים מקוריים; @Autowired חלל ציבורי configureGlobal (AuthenticationManagerBuilder auth) זורק חריג {auth.jdbcAuthentication () .dataSource (dataSource) .withDefaultSchema () .withUser (User.withUsername ("משתמש"). סיסמה (passwordEncoder ()) קידוד ("סיסמה"). " ) .roles ("משתמש")); } @Bean סיסמא ציבורית Encoder סיסמא Encoder () {להחזיר BCryptPasswordEncoder חדש (); }

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

סכמת משתמשים בסיסית זו מתועדת בנספח אבטחת האביב.

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

2.3. אימות התצורה

בואו ניצור נקודת קצה פשוטה מאוד לאחזור המאומתים קֶרֶן מֵידָע:

@RestController @RequestMapping ("/ מנהל") מחלקה ציבורית UserController {@GetMapping ציבורי מנהל retrievePrincipal (מנהל ראשי) {return return; }}

בנוסף אנו נבטיח נקודת קצה זו תוך מתן גישה למסוף H2:

@Configuration בכיתה הציבורית SecurityConfiguration מרחיב את WebSecurityConfigurerAdapter {@Override מוגן ריק להגדיר (HttpSecurity httpSecurity) זורק חריג {httpSecurity.authorizeRequests () .antMatchers ("/ h2-console / **") .permitAll () .anyRequesticated (). .and () .formLogin (); httpSecurity.csrf () .ignoringAntMatchers ("/ h2-console / **"); httpSecurity.headers () .frameOptions () .sameOrigin (); }}

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

כעת נפעיל את היישום ונדפדף במסוף H2. אנחנו יכולים לאמת זאת אביב יוצר שתי טבלאות במסד הנתונים המשובץ שלנו: משתמשים ו רָשׁוּיוֹת.

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

לבסוף, בואו נאמת ונבקש את ה- /קֶרֶן נקודת קצה כדי לראות את המידע הקשור, כולל פרטי המשתמש.

2.4. מתחת למכסת המנוע

בתחילת פוסט זה הצגנו קישור להדרכה שהסבירה כיצד אנו יכולים להתאים אישית את האימות המגובה על בסיס הנתונים ולהטמיע את ה- UserDetailsService מִמְשָׁק; אנו ממליצים בחום לבחון את הפוסט הזה אם אנו רוצים להבין כיצד הדברים עובדים מתחת למכסה המנוע.

במקרה זה, אנו מסתמכים על יישום של אותו ממשק שמספק Spring Security; ה JdbcDaoImpl.

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

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

בואו נראה מה יקרה אם נשנה את התצורה לשימוש בשירות JDBC אחר.

3. התאמת הסכימה למסד נתונים אחר

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

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

3.1. תלות ותצורת מסד נתונים

בתור התחלה, בואו נסיר את h2 תלות והחלפו לספריית MySQL המתאימה:

 mysql mysql-connector-java 8.0.17 

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

עכשיו נקבע מחדש את מאפייני היישום בהתאם:

spring.datasource.url = jdbc: mysql: // localhost: 3306 / jdbc_authentication spring.datasource.username = root spring.datasource.password = לעבור

3.2. הפעלת תצורת ברירת המחדל

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

docker run -p 3306: 3306 - name bael-mysql -e MYSQL_ROOT_PASSWORD = pass -e MYSQL_DATABASE = jdbc_authentication mysql: אחרון

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

למעשה, היישום לא יוכל להתחיל, בגלל SQLSyntaxErrorException. זה ממש הגיוני; כפי שאמרנו, מרבית התצורה האוטומטית המוגדרת כברירת מחדל מתאימה ל- HSQLDB.

במקרה הזה, התסריט DDL שסופק עם withDefaultSchema ההנחיה משתמשת בניב שאינו מתאים ל- MySQL.

לכן, עלינו להימנע משימוש בסכמה זו ולספק משלנו.

3.3. התאמת תצורת האימות

מכיוון שאנו לא רוצים להשתמש בסכמת ברירת המחדל, נצטרך להסיר את ההצהרה המתאימה מה- AuthenticationManagerBuilder תְצוּרָה.

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

@Autowired חלל ציבורי configureGlobal (AuthenticationManagerBuilder auth) זורק Exception {auth.jdbcAuthentication () .dataSource (dataSource); }

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

ראשית, שלנו schema.sql:

צור משתמשים בטבלה (שם משתמש VARCHAR (50) לא NULL, סיסמה VARCHAR (100) לא NULL, מופעל TINYINT לא NULL ברירת מחדל 1, מפתח ראשוני (שם משתמש)); צור רשויות טבלה (שם משתמש VARCHAR (50) לא NULL, סמכות VARCHAR (50) לא NULL, מפתח חוץ (שם משתמש) הפניות למשתמשים (שם משתמש)); צור אינדקס ייחודי ix_auth_username ברשויות (שם משתמש, סמכות);

ואז, שלנו data.sql:

- משתמש המשתמש / העביר ערכי INSERT INTO (שם משתמש, סיסמה, מופעל) ('user', '$ 2a $ 10 $ 8. UnVuG9HHgffUDAlk8qfOuVGkqRzgVymGe07xd00DMxs.AQubh4a', 1); הכנס לערכי רשויות (שם משתמש, סמכות) ('משתמש', 'ROLE_USER');

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

  • מכיוון שאיננו מצפים מ- 'שינה' ליצור את הסכימה כעת, עלינו להשבית את ה- ddl-auto תכונה
  • כברירת מחדל, Spring Boot מאותחל את מקור הנתונים רק עבור מסדי נתונים משובצים, מה שלא במקרה כאן:
spring.datasource.initialization-mode = תמיד spring.jpa.hibernate.ddl-auto = none

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

4. התאמת השאילתות לסכמה אחרת

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

4.1. שינוי סכימת ברירת המחדל

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

צור טבלה bael_users (שם VARCHAR (50) לא NULL, דוא"ל VARCHAR (50) לא NULL, סיסמה VARCHAR (100) לא NULL, מופעל TINYINT לא NULL ברירת מחדל 1, מפתח ראשוני (דוא"ל)); צור רשויות שולחן (דוא"ל VARCHAR (50) לא אפס, סמכות VARCHAR (50) לא אפס, מפתח חוץ (דוא"ל) הפניות bael_users (דוא"ל)); צור אינדקס ייחודי ix_auth_email ברשויות (דוא"ל, סמכות);

לבסוף, שלנו data.sql התסריט יותאם גם לשינוי זה:

- משתמש [מוגן באמצעות דואר אלקטרוני] / העבר INSERT INTO bael_users (שם, דוא"ל, סיסמה, מופעל) ערכים ('משתמש', '[דוא"ל מוגן]', '$ 2a $ 10 $ 8. UNVuG9HHgffUDAlk8qfOuVGkqRzgVymGe07xd00DMxs.AQubh4a', 1); הוסף ערכי רשויות (דוא"ל, סמכות) ('[מוגן באמצעות דוא"ל]', 'ROLE_USER');

4.2. הפעלת היישום באמצעות הסכימה החדשה

בואו נפעיל את היישום שלנו. זה מאותחל נכון, וזה הגיוני מכיוון שהסכמה שלנו נכונה.

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

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

4.3. התאמה אישית של שאילתות החיפוש

התאמת השאילתות היא די קלה. עלינו פשוט לספק הצהרות SQL משלנו בעת קביעת התצורה של ה- AuthenticationManagerBuilder:

@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) זורק חריג {auth.jdbcAuthentication () .dataSource (dataSource) .usersByUsernameQuery ("בחר דוא"ל, סיסמה, מופעלת" + "מ- bael_users" + "איפה דוא"ל =?") .AuthoritiesByUs. בחר דוא"ל, סמכות "+" מהרשויות "+" היכן דוא"ל =? "); }

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

5. מסקנה

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

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

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

תחתית התמדה

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

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

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