שני דפי כניסה עם אבטחת אביב

1. הקדמה

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

2. קביעת תצורה של 2 רכיבי Http

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

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

  • /מִשׁתַמֵשׁ* עבור דפים שיזדקקו לאימות משתמשים רגיל
  • / מנהל * לדפים אליהם יקבל מנהל מערכת

כל אחד http לאלמנט יהיה דף כניסה אחר וכתובת URL אחרת לעיבוד כניסה.

על מנת להגדיר שני תצורות שונות http אלמנטים, בואו ניצור שני מחלקות סטטיות עם הערות @תְצוּרָה המאריכים את מתאם WebSecurityConfigurer.

שניהם יוצבו בתוך רגיל @תְצוּרָה מעמד:

@Configuration @EnableWebSecurity מחלקה ציבורית SecurityConfig {...}

בואו נגדיר את מתאם WebSecurityConfigurer בשביל ה "מנהל" משתמשים:

@Configuration @Order (1) מחלקה סטטית ציבורית App1ConfigurationAdapter מרחיב את WebSecurityConfigurerAdapter {public App1ConfigurationAdapter () {super (); } תצורת הריק המוגנת על ידי @Override (HttpSecurity http) זורקת חריג {http.antMatcher ("/ admin *") .authorizeRequests () .anyRequest () .hasRole ("ADMIN"). ו- () .formLogin () .loginPage (" / loginAdmin ") .loginProcessingUrl (" / admin_login ") .failureUrl (" / loginAdmin? error = loginError ") .defaultSuccessUrl (" / adminPage ") .and () .logout () .logoutUrl (" / admin_logout ") .logoutSuccessUr ("/ protectedLinks") .deleteCookies ("JSESSIONID") .and () .exceptionHandling () .accessDeniedPage ("/ 403"). ו- () .csrf (). השבת (); }}

ועכשיו, בואו נגדיר את מתאם WebSecurityConfigurer למשתמשים רגילים:

@Configuration @Order (2) מחלקה סטטית ציבורית App2ConfigurationAdapter מרחיב את WebSecurityConfigurerAdapter {public App2ConfigurationAdapter () {super (); } הגדר חלל מוגן (HttpSecurity http) זורק חריג {http.antMatcher ("/ user *") .authorizeRequests () .anyRequest () .hasRole ("USER"). and () .formLogin () .loginPage ("/ loginUser) ") .loginProcessingUrl (" / user_login ") .failureUrl (" / loginUser? error = loginError ") .defaultSuccessUrl (" / userPage "). and () .logout () .logoutUrl (" / user_logout ") .logoutSuccessUrl (" / protectedLinks ") .deleteCookies (" JSESSIONID ") .and () .exceptionHandling () .accessDeniedPage (" / 403 "). and () .csrf (). disable (); }}

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

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

3. דפי כניסה מותאמים אישית

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

דף כניסה למשתמש

מִשׁתַמֵשׁ:
סיסמה:

דף הכניסה של מנהל המערכת דומה, אלא שלטופס תהיה פעולה של "Admin_login" לפי תצורת Java.

4. תצורת אימות

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

4.1. שימוש במקור אימות משתמשים נפוץ

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

בואו נדגים תרחיש זה באמצעות InMemoryUserDetailsManager שמגדיר שני משתמשים - אחד עם תפקיד "מִשׁתַמֵשׁ" ואחד עם תפקיד של "מנהל":

@Bean UserDetailsService ציבוריים userDetailsService () זורק חריג {מנהל InMemoryUserDetailsManager = InMemoryUserDetailsManager חדש (); manager.createUser (משתמש .withUsername ("משתמש"). סיסמה (מקודד (). קידוד ("userPass")) .roles ("USER") .build ()); manager.createUser (משתמש .withUsername ("admin"). סיסמה (מקודד (). encode ("adminPass")) .roles ("ADMIN") .build ()); מנהל החזר; } @Bean מקודד סטטיסטי PasswordEncoder () {להחזיר BCryptPasswordEncoder חדש (); }

4.2. שימוש בשני מקורות אימות משתמשים שונים

אם יש לך מקורות שונים לאימות משתמשים - אחד למנהלי מערכת ואחד למשתמשים רגילים - אתה יכול להגדיר AuthenticationManagerBuilder בתוך כל סטטי @תְצוּרָה מעמד. בואו נסתכל על דוגמה של מנהל אימות עבור "מנהל" מִשׁתַמֵשׁ:

@Configuration @Order (1) מחלקה סטטית ציבורית App1ConfigurationAdapter מרחיב WebSecurityConfigurerAdapter {@Override מוגן חלל להגדיר (AuthenticationManagerBuilder auth) זורק Exception {auth.inMemoryAuthentication () .withUser ("admin"). סיסמה (קודן (admin) ". )) .roles ("מנהל"); }}

במקרה זה, UserDetailsService שעועית מהסעיף הקודם כבר לא תשמש.

6. מסקנה

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

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

כאשר אתה מריץ את היישום, תוכל לגשת לדוגמאות לעיל ב- / protectedLinks URI.


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