הפנה לדפים שונים לאחר הכניסה עם Spring Security

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

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

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

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

Spring Security מספק רכיב שבאחריותו הישירה להחליט מה לעשות לאחר אימות מוצלח - ה- AuthenticationSuccessHandler.

2.1. תצורה בסיסית

בואו נקדים להגדיר בסיסי @תְצוּרָה ו @שֵׁרוּת מעמד:

@Configuration @EnableWebSecurity המחלקה הציבורית SecSecurityConfig מרחיב את WebSecurityConfigurerAdapter {@Override מוגן חלל מוגדר (HttpSecurity הסופי) זורק חריג {http .authorizeRequests () // ... נקודות קצה .formLogin () .loginPage ("/ loginloghtml). ("/ login") .defaultSuccessUrl ("/ homepage.html", true) // ... תצורה אחרת}}

החלק בתצורה זו להתמקד בה הוא defaultSuccessUrl () שיטה. לאחר כניסה מוצלחת, כל משתמש יופנה אליו דף הבית.html.

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

המחלקה הציבורית @Service MyUserDetailsService מיישמת את UserDetailsService {תפקידים פרטיים של מפה = HashMap חדש (); @PostConstruct פן ריק () init () {role.put ("admin2", משתמש חדש ("admin", "{noop} admin1", getAuthority ("ROLE_ADMIN"))); roller.put ("user2", משתמש חדש ("user", "{noop} user1", getAuthority ("ROLE_USER"))); } @Override UserDetails ציבורי loadUserByUsername (שם משתמש מחרוזת) {return role.get (שם משתמש); } רשימה פרטית getAuthority (תפקיד מחרוזת) {return Collections.singletonList (חדש SimpleGrantedAuthority (תפקיד)); }} 

כמו כן, שים לב שבדוגמה הפשוטה הזו לא נשתמש במקודד סיסמה, ולכן הסיסמאות מוקדמות {noop}.

2.2. הוספת המטפל בהצלחה בהתאמה אישית

כעת יש לנו שני משתמשים עם שני התפקידים השונים: מִשׁתַמֵשׁ ו מנהל. לאחר כניסה מוצלחת, שניהם יופנו אל hompeage.html. בואו נסתכל כיצד ניתן לבצע הפניה שונה על סמך תפקיד המשתמש.

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

@Bean AuthenticationSuccessHandler myAuthenticationSuccessHandler () {להחזיר MySimpleUrlAuthenticationSuccessHandler חדש (); } 

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

התצורה הריקה המוגנת על ידי @Override (HttpSecurity הסופי http) זורקת חריג {http .authorizeRequests () // נקודות קצה .formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ login") .successHandler (myAuthenticationSuccessHandler () // תצורה אחרת} 

2.3. תצורת XML

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

3. המטפל בהצלחה של אימות מותאם אישית

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

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

קודם כל, עלינו לבטל את ה onAuthenticationSuccess שיטה:

מחלקה ציבורית MySimpleUrlAuthenticationSuccessHandler מיישם AuthenticationSuccessHandler {logger Log logger = LogFactory.getLog (this.getClass ()); פרטי RedirectStrategy redirectStrategy = חדש DefaultRedirectStrategy (); @ ביטול חלל ציבורי ב- AuthenticationSuccess (בקשת HttpServletRequest, תגובה HttpServletResponse, אימות אימות) זורק IOException {ידית (בקשה, תגובה, אימות); clearAuthenticationAttributes (בקשה); } 

השיטה המותאמת אישית שלנו מכנה שתי שיטות עוזרות:

ידית חלל מוגנת (בקשת HttpServletRequest, תגובה HttpServletResponse, אימות אימות) זורקת IOException {String targetUrl = determTargetUrl (אימות); if (response.isCommitted ()) {logger.debug ("התגובה כבר בוצעה. לא ניתן להפנות מחדש אל" + targetUrl); לַחֲזוֹר; } redirectStrategy.sendRedirect (בקשה, תגובה, targetUrl); } 

כאשר השיטה הבאה עובדת בפועל וממפה את המשתמש לכתובת אתר היעד:

מחרוזת מוגנת determTargetUrl (אימות אימות סופי) {Map roleTargetUrlMap = HashMap חדש (); roleTargetUrlMap.put ("ROLE_USER", "/homepage.html"); roleTargetUrlMap.put ("ROLE_ADMIN", "/console.html"); רשויות הגבייה הסופיות = authentication.getAuthorities (); עבור (סופי GrantedAuthority givenAuthority: autorities) {String AuthorityName = givenAuthority.getAuthority (); אם (roleTargetUrlMap.containsKey (AuthorityName)) {return roleTargetUrlMap.get (AuthorityName); }} זרוק IllegalStateException (); } 

שים לב ששיטה זו תחזיר את כתובת האתר הממופה לתפקיד הראשון שיש למשתמש. אז אם למשתמש יש מספר תפקידים, כתובת האתר הממופה תהיה זו שתואמת את התפקיד הראשון שניתן ב- רָשׁוּיוֹת אוסף.

מוגן ריק clearAuthenticationAttributes (HttpServletRequest בקשה) {HttpSession session = request.getSession (false); אם (session == null) {return; } session.removeAttribute (WebAttributes.AUTHENTICATION_EXCEPTION); }

ה determTargetUrl - שהיא ליבת האסטרטגיה - פשוט מסתכל על סוג המשתמש (נקבע על ידי הרשות) ו בוחר בכתובת אתר היעד על סמך תפקיד זה.

אז, משתמש מנהל - נקבע על ידי ROLE_ADMIN סמכות - ינותב לדף המסוף לאחר הכניסה, בעוד המשתמש הסטנדרטי - כפי שנקבע על ידי ROLE_USER - יופנה לדף הבית.

4. מסקנה

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


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