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

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

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

2. הוענק רשות

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

בעת שימוש ב- הוענק רשות באופן ישיר, כגון באמצעות ביטוי כמו hasAuthority ('READ_AUTHORITY'), אנחנו הגבלת הגישה בצורה דקה.

כפי שאתה כנראה יכול להתכנס, אנו יכולים להתייחס למושג רָשׁוּת על ידי שימוש ב זְכוּת גם כן.

3. תפקיד כסמכות

באופן דומה, באבטחת אביב, אנחנו יכולים תחשוב על כל אחד תפקיד כ גרגר גרגר הוענק רשות המיוצג כ- חוּט וקידומת "תַפְקִיד. בעת שימוש ב- תַפְקִיד באופן ישיר, כגון באמצעות ביטוי כמו hasRole ("ADMIN")אנו מגבילים את הגישה בצורה גסה.

ראוי לציין כי ברירת המחדל "תַפְקִיד" ניתן להגדיר את הקידומת, אך ההסבר כיצד לעשות זאת הוא מעבר לתחום של מאמר זה.

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

4. תפקיד כמכולה

עכשיו כשראינו איך המסגרת משתמשת ב תַפְקִיד מושג, בואו נדון במהירות גם בחלופה - וזה שימוש בתפקידים כמכולות של רשויות / הרשאות.

זוהי גישה ברמה גבוהה יותר לתפקידים - מה שהופך אותם למושג יותר עסקי ולא למוקד יישום.

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

5. תצורת אבטחה באביב

אנו יכולים להדגים דרישת הרשאה דקה על ידי הגבלת הגישה ל / מוגן על ידי רשות למשתמשים עם READ_AUTHORITY.

אנו יכולים להדגים דרישת הרשאה גסה על ידי הגבלת הגישה ל / protectedbyrole למשתמשים עם ROLE_USER.

בואו להגדיר תרחיש כזה בתצורת האבטחה שלנו:

תצורת הריק המוגנת על ידי @Override (HttpSecurity http) זורקת חריג {// ... .antMatchers ("/ protectedbyrole"). HasRole ("USER") .antMatchers ("/ protectedbyauthority"). HasAuthority ("READ_PRIVILEGE") //. ..}

6. ראשוני נתונים פשוטים

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

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

אנו נשמע לאירוע רענון ההקשר:

@Override @ Transactional void public onApplicationEvent (ContextRefreshedEvent event) {MyPrivilege readPrivilege = createPrivilegeIfNotFound ("READ_PRIVILEGE"); MyPrivilege writePrivilege = createPrivilegeIfNotFound ("WRITE_PRIVILEGE"); }

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

7. UserDetailsService

היישום שלנו של UserDetailsService זה המקום בו מיפוי הסמכות מתרחש. לאחר שהמשתמש אימת, שלנו getAuthorities () השיטה מאכלסת ומחזירה א פרטי המשתמש לְהִתְנַגֵד:

אוסף פרטי getAuthorities (תפקידי אוסף) {רשויות רשימה = ArrayList חדש (); עבור (תפקיד תפקיד: תפקידים) {autorities.add (חדש SimpleGrantedAuthority (role.getName ())); role.getPrivileges (). stream () .map (p -> SimpleGrantedAuthority חדש (p.getName ())) .forEach (סמכויות :: הוסף); } להחזיר רשויות; }

8. ריצה ובדיקת הדוגמא

אנחנו יכולים לבצע את הדוגמה תפקידים Autorities יישום יישום Java, נמצא בפרויקט GitHub.

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

  • גישה // localhost: 8082 / protectedbyrole
  • אמת כ- [מוגן בדוא"ל] (הסיסמה היא "מִשׁתַמֵשׁ")
  • שים לב לאישור מוצלח
  • גישה // localhost: 8082 / protectedbyauthority
  • שים לב לאישור לא מוצלח

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

  • גישה // localhost: 8082 / protectedbyauthority
  • אמת כ- [מוגן באמצעות הדוא"ל] / מנהל מערכת
  • שים לב לאישור מוצלח
  • גישה // localhsot: 8082 / protectedbyrole
  • שים לב לאישור לא מוצלח

9. מסקנה

במדריך מהיר זה בדקנו את ההבדל העדין אך המשמעותי בין a תַפְקִיד ו הוענק רשות באבטחת אביב.


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