מבוא לביטויי אבטחה באביב

1. הקדמה

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

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

מאמר זה הוא הרחבה של Spring Express Expressions - hasRole Example.

2. תלות Maven

על מנת להשתמש באבטחת אביב, עליך לכלול את החלק הבא pom.xml קוֹבֶץ:

  org.springframework.security spring-security-web 5.2.3.RELEASE 

הגרסה האחרונה תוכל למצוא כאן.

והערה מהירה - תלות זו מכסה רק את ביטחון האביב; אל תשכח להוסיף שפרינג-ליבה ו אביב-הקשר ליישום אינטרנט מלא.

3. תצורה

ראשית, בואו נסתכל על תצורת Java.

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

@Configuration @EnableAutoConfiguration @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) בכיתה ציבורית SecurityJavaConfig מרחיב את WebSecurityConfigurerAdapter {...}

אנו יכולים כמובן לבצע תצורת XML גם כן:

4. ביטויים לאבטחת רשת

עכשיו, נתחיל לבחון את ביטויי האבטחה:

  • hasRole, hasAnyRole
  • יש Autority, hasAnyAuthority
  • היתר הכל, להכחיש הכל
  • הוא אנונימי, isRememberMe, הוא מאומת, הוא מאושר לחלוטין
  • קֶרֶן, אימות
  • יש הרשאה

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

4.1. hasRole, hasAnyRole

ביטויים אלה אחראים להגדרת בקרת הגישה או ההרשאה לכתובות URL או שיטות ספציפיות ביישום שלך.

בואו נסתכל על הדוגמה:

תצורת הריקות המוגנת על ידי @Override (HttpSecurity הסופי) זורקת חריג {... .antMatchers ("/ auth / admin / *"). HasRole ("ADMIN") .antMatchers ("/ auth / *"). HasAnyRole ("ADMIN "," USER ") ...} 

בדוגמה זו אנו מציינים גישה לכל הקישורים החל מ- / auth / מוגבלת למשתמשים שמחוברים לתפקיד מִשׁתַמֵשׁ או תפקיד מנהל. יתר על כן, כדי לגשת לקישורים החל מ- / auth / admin / אנחנו צריכים להיות מנהל תפקיד במערכת.

אותה תצורה עשויה להיות מושגת בקובץ XML על ידי כתיבה:

4.2. hasAuthority, hasAnyAuthority

התפקידים והרשויות דומים באביב.

ההבדל העיקרי הוא שבתפקידים יש סמנטיקה מיוחדת - החל באביב אבטחה 4, "תַפְקִיד_'קידומת מתווספת אוטומטית (אם היא עדיין לא שם) בשיטה כלשהי שקשורה לתפקיד.

כך hasAuthority ('ROLE_ADMIN') דומה ל hasRole ('מנהל') בגלל ה 'תַפְקִיד_'הקידומת מתווספת אוטומטית.

אבל הדבר הטוב בשימוש ברשויות הוא שאנחנו לא צריכים להשתמש ב תַפְקִיד_ קידומת בכלל.

הנה דוגמה מהירה שבה אנו מגדירים משתמשים עם רשויות ספציפיות:

התצורה הריקה המוגנת על ידי @Override (AuthenticationManagerBuilder auth) זורקת חריג {auth.inMemoryAuthentication () .withUser ("user1"). סיסמה (מקודד (). Encode ("user1Pass")) .authorities ("USER"). (). withUser ("admin"). סיסמה (מקודד (). encode ("adminPass")) .authorities ("ADMIN"); } 

לאחר מכן אנו יכולים כמובן להשתמש בביטויים אלה של הרשויות:

תצורת הריק המוגנת על ידי @Override (HttpSecurity הסופי) זורקת חריג {... .antMatchers ("/ auth / admin / *"). HasAuthority ("ADMIN") .antMatchers ("/ auth / *"). HasAnyAuthority ("ADMIN "," USER ") ...}

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

@Bean PasswordEncoder הציבורי passwordEncoder () {להחזיר BCryptPasswordEncoder חדש (); }

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

וגם:

4.3. היתר הכל, להכחיש הכל

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

בואו נסתכל על הדוגמה:

... .antMatchers ("/ *"). permitAll () ...

באמצעות תצורה זו, נאשר לכל המשתמשים (אנונימיים ומחוברים) לגשת לדף החל מ- '/' (למשל, דף הבית שלנו).

אנו יכולים גם למנוע גישה לכל שטח URL שלנו:

... .antMatchers ("/ *"). denyAll () ...

ושוב, ניתן לבצע את אותה תצורה עם תצורת XML גם כן:

4.4. isAnonymous, isRememberMe, isAuthenticated, isFollyAuthenticated

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

... .antMatchers ("/ *"). אנונימי () ...

אותו הדבר בתצורת XML:

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

... .antMatchers ("/ *"). מאומת () ...

או גרסת XML:

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

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

... .antMatchers ("/ *"). rememberMe () ...

או גרסת XML:

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

על מנת לעשות זאת, אנו עשויים לציין isFullyAuthenticated (), שחוזר נָכוֹן אם המשתמש אינו אנונימי או משתמש לזכור אותי:

... .antMatchers ("/ *"). לגמרי מאומת () ...

או גרסת ה- XML:

4.5. מנהל, אימות

ביטויים אלה מאפשרים גישה ל קֶרֶן אובייקט המייצג את המשתמש המורשה (או האנונימי) הנוכחי ואת הנוכחי אימות אובייקט מה אבטחה הקשר, בהתאמה.

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

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

שניהם מתוארים בפירוט רב יותר במאמר הבא: אחזר מידע על משתמשים באבטחת אביב.

4.6. יש הרשאה ממשקי API

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

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

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

@PreAuthorize ("hasPermission (#articleId, 'isEditor')") public public void acceptArticle (מאמר המאמר) {...}

רק משתמש מורשה יכול להתקשר לשיטה זו, וגם המשתמש צריך לקבל הרשאה isEditor בשירות.

עלינו גם לזכור להגדיר במפורש א PermissionEvaluator בהקשר היישום שלנו:

איפה customInterfaceImplementation יהיה הכיתה המיישמת PermissionEvaluator.

כמובן שנוכל לעשות זאת גם בתצורת Java:

@Override מוגן MethodSecurityExpressionHandler expressionHandler () {DefaultMethodSecurityExpressionHandler expressionHandler = DefaultMethodSecurityExpressionHandler חדש (); expressionHandler.setPermissionEvaluator (CustomInterfaceImplementation חדש ()); ביטוי להחזיר מפעיל; }

5. מסקנה

מדריך זה הוא מבוא מקיף ומדריך לביטויי אבטחה באביב.

כל הדוגמאות הנדונות כאן זמינות בפרויקט GitHub.


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