הבטח את האבטחה של אפליקציית Spring שלך על ידי מינוף התכונות החזקות שמציעה מסגרת Spring Security.
מסגרת Spring Security מאבטחת את האפליקציה שלך באמצעות אימות והרשאה. במצב ברירת המחדל שלה, Spring Security מבטיח שכל נתיב בקשת HTTP (או עמוד) באפליקציה שלך דורש אימות של משתמש גלובלי יחיד.
מסגרת זו גם גמישה ביותר. זה מאפשר לך ליצור כללי אבטחה מותאמים אישית עבור כל נתיב בקשת HTTP ביישום שלך, כמו גם למשתמשים השונים. לכן, אתה יכול להסיר את מגבלת האבטחה בדפים שאינם דורשים הרשאת משתמש (כגון דף בית). והגדר את התפקידים והסמכויות של סוגי משתמשים ספציפיים.
הוספת Spring Security לאפליקציה שלך
ישנן שתי דרכים להוסיף את Spring Security לאפליקציה שלך. אתה יכול לבחור בו כתלות בעת יצירת יישום Spring Boot חדש באמצעות Spring initializr, או הוסף אותו לקובץ מפרט ה-build שלך בקטע התלות לאחר יצירת הפרויקט שלך.
אם בחרת באחת מאפשרויות פרויקט Gradle, אז קובץ התלות הוא build.gradle. עם זאת, אם בחרת ב-Maven, אז הקובץ הזה הוא pom.xml.
שֶׁלְךָ build.gradle הקובץ צריך להכיל את התלות הבאה:
dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}
בזמן שע' שלךom.xml הקובץ צריך להכיל את התלות הבאה:
org.springframework.boot
spring-boot-starter-security
היישום לדוגמה המשמש במאמר זמין כאן מאגר GitHub והוא בחינם עבורך לשימוש תחת רישיון MIT.
שימוש באבטחת אביב
לאחר שתוסיף את התלות של Spring Security לאפליקציה שלך, תוכל להתחיל להשתמש במסגרת מיידית. פשוט הפעל את היישום שלך ואז נווט אל דף הבית של Spring Boot (או כל דף ביישום שלך). היישום לדוגמה משתמש בבקר הראשוני הבא כדי לשלוט בברירת המחדל של Spring Boot מארח מקומי: 8080 בַּקָשָׁה:
package com.springSecurityDemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
publicclassWebController{
@GetMapping("/")
public String home(){
return"Welcome!";
}
}
הפעלת היישום שלך לאחר הוספת מחלקת הבקר הבודדת למעלה יוצר את התצוגה הראשונית הבאה:
תשים לב שזה מפנה אותך אוטומטית אל localhost: 8080/login דף, והוא עושה זאת לפני שהוא מאפשר לך לגשת לכל דף אחר של האפליקציה. בשלב זה, תצטרך לספק את שם המשתמש המוגדר כברירת מחדל (שהוא המשתמש) ואת הסיסמה שנוצרת אוטומטית (שאותה תמצא במסוף). הקונסולה תיצור שורה כמו הבאה:
Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81
בכל פעם שתפעיל מחדש את היישום שלך, הסיסמה שנוצרת אוטומטית תשתנה, אך שם המשתמש יישאר זהה. הזנת שם המשתמש והסיסמה המוגדרים כברירת מחדל תפנה אותך לתצוגה המתאימה באפליקציה שלך.
התאמה אישית של אבטחת אביב
כדי להתאים אישית את אבטחת האפליקציה שלך, תצטרך לעקוף את תצורת ברירת המחדל של Spring Security. אבל לפני כן (בהנחה שכבר יש לך את Spring Web) תזדקק למספר תלות אחרות עבור יישום לדוגמה זה:
- Spring Data JPA
- מנהל התקן MySQL JDBC
- קורנית
- לומבוק
מסגרת Thymeleaf תייצר תצוגות שונות. Lombok תעזור לצמצם את הקוד במחלקות האובייקט שלך. ספריית JPA ומנהל ההתקן של MySQL יאפשרו לך להשתמש במסד נתונים של MySQL עם האפליקציה, אבל יש לך אפשרות להשתמש בכל מסד נתונים שנוח לך איתו. שימוש במסד נתונים פירושו הגדרת התצורה של יישומים.מאפיינים קובץ תחת קובץ המשאבים.
spring.datasource.url=jdbc: mysql://${MYSQL_HOST: localhost}:3306/spring_security
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
קוד התצורה למעלה מאפשר לך להתחבר למסד נתונים מקומי של MySQL בשם אביב_ביטחון, עם שם משתמש של שורש, וסיסמא (1234). תצטרך לעדכן את הנתונים האלה כך שיתאימו לשם מסד הנתונים והאישורים שלך.
לאחר הוספת התלות הנוספת שלך ויצירת מסד הנתונים שלך, אתה יכול להתחיל להחליט כמה צפיות יהיו לאפליקציה שלך. תצטרך גם לדעת איך נראית האבטחה של כל עמוד. ליישום לדוגמה שלנו יש 6 צפיות:
- דף הבית
- דף הרשמה
- עמוד התחברות
- עמוד התנתק
- עמוד משתמש
- דף שגיאה
התצוגה היחידה שתדרוש הרשאת משתמש היא דף המשתמש. דף זה נגיש רק למשתמשים שנרשמים תחילה ולאחר מכן נכנסים לאפליקציה. בנוסף לחבילת ברירת המחדל של Spring Boot, תצטרך ליצור ארבע חבילות אחרות ביישום שלך.
כיתת מבקר הרישום
חבילת הבקר תכיל את המחלקות המטפלות בבקשות HTTP. בהתאם לתפקוד של דף, אתה יכול בדרך כלל לקבץ כל בקשת HTTP למחלקת בקר אחת, כפי שקורה ב- WebController מעמד. עם זאת, לתצוגת הרישום יש פונקציות ייחודיות יותר, ולכן, היא יכולה לקבל מחלקת בקר פרטית:
@Controller
@RequestMapping("/register")
publicclassRegistrationController{
private UserRepository userRepo;
private PasswordEncoder passwordEncoder;
publicRegistrationController( UserRepository userRepo, PasswordEncoder passwordEncoder){
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
@GetMapping
public String registerForm(){
return"registration";
}
@PostMapping
public String processRegistration(RegistrationForm form){
userRepo.save(form.toUser(passwordEncoder));
return"redirect:/login";
}
}
ה RegistrationController class הוא שער להיבט האבטחה של היישום שלך. ה @RequestMapping הערה מציינת את סוג הבקשה שבקר זה יטפל (בקשות ל מארח מקומי: 8080/register).
ה @GetMapping ביאור פשוט מציין שאם הבקשה מקבלת בקשה ל /register, ה טופס הרשמה() השיטה צריכה לטפל בבקשה על ידי החזרת תצוגת הרישום.
לאחר שמבקר לוחץ על כפתור ההרשמה, ואז @PostMapping ביאור נכנס לפעולה. ה processRegistration() השיטה מאפשרת לך לפרסם את נתוני המשתמש שהיא מקבלת מה- טופס הרשמה מחלקה למסד הנתונים, באמצעות ה מאגר משתמשים מעמד. אבל לפני שהוא מאחסן את הנתונים האלה, ה processRegistration() שיטה מצפינה את סיסמת המשתמש באמצעות של אביבמקודד סיסמה מִמְשָׁק.
יצירת תצורות אבטחה חדשות
מאז Spring 3.1, מפתחים יכולים כעת ליצור תצורות עבור Spring Security באמצעות Java, כלומר מחלקות במקום XML. הדבר העיקרי ששיעורי התצורה הללו דורשים הוא @תְצוּרָה ביאור.
@Configuration
publicclassSecurityConfiguration{
}
ה @תְצוּרָה הערה מציינת שהמחלקה שלמעלה היא מחלקת תצורה. שיעורים אלה מספקים שעועית ל הקשר יישום אביב, שהוא מיכל שבו משתמש Spring כדי ליצור ולנהל את הרכיבים (או השעועית) השונים של אפליקציה. השעועית הראשונה ב תצורת אבטחה הכיתה היא מקודד סיסמא אפונה.
@Bean
public PasswordEncoder passwordEncoder(){
returnnew BCryptPasswordEncoder();
}
ה RegistrationController הכיתה משתמשת ב- מקודד סיסמא bean כדי לקודד סיסמאות חדשות לפני שמירתן במסד הנתונים. שעועית חשובה נוספת שתצטרך להוסיף ל תצורת אבטחה הכיתה היא userDetailsService אפונה.
@Bean
public UserDetailsService userDetailsService(UserRepository userRepo){
return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
thrownew UsernameNotFoundException("Customer '" + username + "' not found");
};
}
ה userDetailsService שעועית מעסיקה אבטחת האביבUserDetailsService ממשק לאחזור שם משתמש וסיסמה של משתמש לצורך אימות, במהלך הפעלת הכניסה של הלקוח. לכן, ברגע שלקוח לוחץ על כפתור ההתחברות בתצוגת הכניסה, ה- userDetailsService שעועית קופצת לתנועה.
דרך ה מאגר משתמשים, ה userDetailsService bean מקבל גישה לכל הלקוחות הקיימים במסד הנתונים. ממשק זה משתמש אז ב- מאגר משתמשים כדי לאתר משתמש עם שם משתמש וסיסמה תואמים, ואז מחזיר את כל התכונות של הלקוח הזה כאובייקט.
אם החפץ המוחזר הוא לקוח, לקוח זה מקבל גישה לאפליקציה. אחרת, הדף יתרענן באופן אוטומטי ויאפשר למשתמש להזין אישורים חוקיים.
שרשרת הסינון
אבטחת אביבSecurityFilterChain הממשק הוא שימושי ממשק תכנות יישומים (API) זה ממלא תפקיד חיוני בתצורת Spring Security. הממשק הזה עובד עם אבטחת האביבHttpSecurity מחלקה ליצירת שרשרת סינון עבור בקשות HTTP ספציפיות.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/user").hasAuthority("USER").anyRequest().permitAll())
.formLogin(formLogin -> formLogin
.loginPage("/login").defaultSuccessUrl("/user", true))
.logout(logout -> logout.logoutSuccessUrl("/logout"));
return http.build();
}
ה סינון שרשרת שעועית לעיל משתמשת ב SecurityFilterChain API לביצוע מספר משימות. ראשית, הוא משתמש ב- HttpSecurity class כדי להכתיב שרק משתמשים בעלי תפקיד של USER יכולים לגשת מארח מקומי: 8080/משתמש. ומשתמש מקבל את התפקיד הזה לאחר הרישום, הודות ל- getAuthorities() שיטה שכל אובייקט לקוח חדש מיישם.
@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("USER"));
}
שרשרת הסינון מאפשרת גישה לא מאומתת לכל שאר כתובות האתרים באפליקציה. ה סינון שרשרת שעועית גם מנצלת את formLogin() ו להתנתק() שיטות של HttpSecurity אובייקט כיתה.
שיטות אלו מאפשרות לך להפנות משתמש אוטומטי לדפים ספציפיים לאחר ביצוע משימה. אז, משתמש שמזין את האישורים הנכונים ולוחץ על כפתור ההתחברות ב- /login הדף יופנה אוטומטית אל /user עמוד.
סוף - סוף, ה סינון שרשרת bean בונה ומחזירה את שרשרת הסינון, המאפשרת למשתמשים מורשים לגשת לאפליקציה. כל שלוש השעועית ב תצורת אבטחה כיתה לעבוד יחד כדי לאבטח את היישום שלך.
אולם, ה סינון שרשרת שעועית ממלאת את התפקיד המשמעותי יותר של הכתבת רמת ההרשאה עבור כל בקשת HTTP. כאשר אתה מתחיל להוסיף עוד דפים ליישום שלך, אתה יכול להשתמש ב- סינון שרשרת שעועית כדי להגדיר את רמת האבטחה שלהם.
היתרון העיקרי של אבטחת אביב
Spring Security נותן לך שליטה מלאה לא רק למי יש גישה לאפליקציה שלך, אלא גם על סוג הגישה שיכולה להיות למשתמש (דרך תכונת תפקידי המשתמש שלו). בקרת גישה היא אחד ההיבטים החשובים ביותר בכל יישום. מתן גישה לא מסוננת למשתמשים כלליים לאפליקציה שלך עקב מחסומי בקרת גישה מוגבלים עשויה להיות טעות יקרה.