אחזר מידע על משתמשים באבטחת אביב

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

מאמר זה יראה כיצד אחזר את פרטי המשתמש באביב אבטחה.

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

2. קבל את המשתמש בשעועית

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

אימות אימות = SecurityContextHolder.getContext (). GetAuthentication (); מחרוזת currentPrincipalName = authentication.getName ();

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

אימות אימות = SecurityContextHolder.getContext (). GetAuthentication (); אם (! (מופע אימות של AnonymousAuthenticationToken)) {String currentUserName = authentication.getName (); החזר currentUserName; }

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

3. הכניס את המשתמש לבקר

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

@Controller מחלקה ציבורית SecurityController {@RequestMapping (value = "/ username", method = RequestMethod.GET) @ResponseBody public מחרוזת currentUserName (ראשי ראשי) {return principal.getName (); }}

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

@Controller מחלקה ציבורית SecurityController {@RequestMapping (value = "/ username", method = RequestMethod.GET) @ResponseBody public מחרוזת currentUserName (אימות אימות) {return authentication.getName (); }}

ה- API של ה- אימות הכיתה פתוחה מאוד כך שהמסגרת תישאר כמה שיותר גמישה. בגלל זה, את מנהל אבטחת האביב ניתן לאחזר רק כ- לְהִתְנַגֵד וצריך להיות יצוק לנכון פרטי המשתמש למשל:

UserDetails userDetails = (UserDetails) authentication.getPrincipal (); System.out.println ("למשתמש יש הרשויות:" + userDetails.getAuthorities ());

ולבסוף, באופן ישיר מבקשת HTTP:

@Controller מחלקה ציבורית GetUserWithHTTPServletRequestController {@RequestMapping (value = "/ username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple (HttpServletRequest בקשה) {Principal principal = request.getUserPrincipal (); להחזיר principal.getName (); }}

4. השג את המשתמש באמצעות ממשק מותאם אישית

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

ממשק ציבורי IAuthenticationFacade {Authentication getAuthentication (); } @Component בכיתה ציבורית AuthenticationFacade מיישם את IAuthenticationFacade {@Override Public Authentication getAuthentication () {return SecurityContextHolder.getContext (). GetAuthentication (); }}

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

@Controller מחלקה ציבורית GetUserWithCustomInterfaceController {@Autowired פרטי IAuthenticationFacade authenticationFacade; @RequestMapping (value = "/ username", method = RequestMethod.GET) @ResponseBody public מחרוזת currentUserNameSimple () {אימות אימות = authenticationFacade.getAuthentication (); להחזיר authentication.getName (); }}

5. השג את המשתמש ל- JSP

המנהל המאומת כעת ניתן לגשת אליו גם בעמודי JSP, על ידי מינוף תמיכת האבטחה באביב. ראשית, עלינו להגדיר את התג בדף:

הבא, אנחנו יכולים התייחס למנהל:

 מאומת כ 

6. השג את המשתמש ל- Thymeleaf

Thymeleaf הוא מנוע תבניות אינטרנט מודרני בצד השרת, עם אינטגרציה טובה עם מסגרת MVC של Spring. בואו נראה כיצד לגשת למנהל המאומת הנוכחי בדף עם מנוע Thymeleaf.

ראשית, עלינו להוסיף את 5. אביב קפיץ וה טימילית-ניצבים-מעיינות אבטחה 5 תלות לשילוב Thymeleaf עם Spring Security:

 org.thymeleaf.extras thymeleaf-extras-springsecurity5 org.thymeleaf thymeleaf-spring5 

עַכשָׁיו אנו יכולים להתייחס אל המנהל בדף ה- HTML באמצעות ה- שניות: הסמכה תְכוּנָה:

 מאומת כ 

7. מסקנה

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

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

// localhost: 8080 / אביב-ביטחון-מנוחה-מותאם אישית / foos / 1

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