אבטחת אביב: בדוק אם למשתמש יש תפקיד בג'אווה

1. הקדמה

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

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

2. בדיקת תפקיד המשתמש בג'אווה

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

2.1. @ PreAuthorize

הדרך הראשונה לבדוק תפקידי משתמש בג'אווה היא להשתמש ב- @ PreAuthorize ביאור המסופק על ידי Spring Security. ניתן להחיל הערה זו על מחלקה או שיטה והיא מקבלת ערך מחרוזת יחיד המייצג ביטוי SpEL.

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

לאחר מכן, Spring Security מספק שני ביטויים שנוכל להשתמש בהם עם ה- @ PreAuthorize ביאור לבדיקת תפקידי המשתמש:

@PreAuthorize ("hasRole ('ROLE_ADMIN')") @GetMapping ("/ user / {id}") getUser מחרוזת ציבורי (@PathVariable ("id") מזהה מחרוזת) {...}

אנו יכולים גם לבדוק מספר תפקידים בביטוי יחיד:

@PreAuthorize ("hasAnyRole ('ROLE_ADMIN', 'ROLE_MANAGER')") @GetMapping ("/ משתמשים") ציבורי מחרוזת getUsers () {...}

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

אם השיטה נקראת מבלי לקבל את התפקיד המתאים, Spring Security משליך חריג ומפנה לדף השגיאה.

2.2. אבטחה הקשר

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

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

כדי להשתמש בו, אנו קוראים פשוט לשיטות הסטטיות SecurityContextHolder:

אימות אימות = SecurityContextHolder.getContext (). GetAuthentication (); אם (auth! = null && auth.getAuthorities (). stream (). anyMatch (a -> a.getAuthority (). שווה ("ADMIN"))) {...}

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

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

2.3. UserDetailsService

הדרך השלישית בה אנו יכולים לחפש תפקידי משתמש בקוד Java היא באמצעות ה- UserDetailsService. זה שעועית שנוכל להזריק לכל מקום ליישום שלנו ולקרוא לזה לפי הצורך:

@GetMapping ("/ משתמשים") ציבורי מחרוזת getUsers () {UserDetails details = userDetailsService.loadUserByUsername ("mike"); אם (פרטים! = null && details.getAuthorities (). stream () .anyMatch (a -> a.getAuthority (). שווה ("ADMIN"))) {// ...}}

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

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

2.4. בקשת סרוולט

אם אנו משתמשים ב- Spring MVC, אנו יכולים גם לבדוק תפקידי משתמש ב- Java באמצעות ה- HttpServletRequest מעמד:

@GetMapping ("/ משתמשים") getUsers ציבורי מחרוזת (בקשת HttpServletRequest) {if (request.isUserInRole ("ROLE_ADMIN")) {...}}

3. מסקנה

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

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


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