تأكد من أمان تطبيق Spring من خلال الاستفادة من الميزات القوية التي يوفرها إطار عمل Spring Security.

يؤمن إطار عمل Spring Security تطبيقك من خلال المصادقة والترخيص. في حالته الافتراضية ، يضمن Spring Security أن كل مسار طلب HTTP (أو صفحة) في تطبيقك يتطلب مصادقة مستخدم عالمي واحد.

هذا الإطار أيضًا مرن للغاية. يسمح لك بإنشاء قواعد أمان مخصصة لكل مسار طلب HTTP في تطبيقك ، بالإضافة إلى المستخدمين المختلفين. لذلك ، يمكنك إزالة قيود الأمان على الصفحات التي لا تتطلب إذن المستخدم (مثل الصفحة الرئيسية). وتعيين الأدوار والصلاحيات لأنواع معينة من المستخدمين.

إضافة أمان الربيع إلى التطبيق الخاص بك

هناك طريقتان لإضافة Spring Security إلى تطبيقك. يمكنك إما تحديده على أنه تبعية عند إنشاء تطبيق Spring Boot جديد باستخدام تهيئة الربيع، أو قم بإضافته إلى ملف مواصفات البناء في قسم التبعية بعد إنشاء مشروعك.

إذا حددت أحد خيارات مشروع Gradle ، فسيكون ملف التبعيات بناء. ومع ذلك ، إذا اخترت Maven ، فسيكون هذا الملف pom.xml.

لك بناء يجب أن يحتوي الملف على التبعية التالية:

dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}
instagram viewer

في حين أن pom.xml يجب أن يحتوي الملف على التبعية التالية:


org.springframework.boot
spring-boot-starter-security

يتوفر نموذج التطبيق المستخدم في المقالة في هذا مستودع جيثب وهو مجاني لك لاستخدامه بموجب ترخيص MIT.

باستخدام Spring Security

بمجرد إضافة تبعية 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!";
}
}

يؤدي تنفيذ التطبيق بعد إضافة فئة وحدة التحكم الفردية أعلاه إلى إنشاء العرض الأولي التالي:

ستلاحظ أنه يوجهك تلقائيًا إلى المضيف المحلي: 8080 / تسجيل الدخول صفحة ، ويفعل ذلك قبل أن يسمح لك بالوصول إلى أي صفحة أخرى من التطبيق. في هذه المرحلة ، ستحتاج إلى تقديم اسم المستخدم الافتراضي (وهو المستخدم) وكلمة المرور التي تم إنشاؤها تلقائيًا (والتي ستجدها في وحدة التحكم). ستنشئ وحدة التحكم سطرًا مثل ما يلي:

Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81

في كل مرة تقوم فيها بإعادة تشغيل التطبيق الخاص بك ، ستتغير كلمة المرور التي تم إنشاؤها تلقائيًا ، ولكن سيظل اسم المستخدم كما هو. سيوجهك إدخال اسم المستخدم وكلمة المرور الافتراضيين إلى العرض المناسب في التطبيق الخاص بك.

تخصيص أمان الربيع

لتخصيص أمان تطبيقك ، ستحتاج إلى تجاوز التكوين الافتراضي لـ Spring Security. ولكن قبل ذلك (بافتراض أن لديك Spring Web بالفعل) ، ستحتاج إلى العديد من التبعيات الأخرى لهذا التطبيق النموذجي:

  • الربيع البيانات 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";
}
}

ال RegisterController class هي بوابة للجانب الأمني ​​للتطبيق الخاص بك. ال RequestMapping يحدد التعليق التوضيحي نوع الطلب الذي ستتعامل معه وحدة التحكم هذه (طلبات المضيف المحلي: 8080 / سجل).

ال GetMapping يشير التعليق التوضيحي ببساطة إلى أنه إذا تلقى التطبيق طلبًا للحصول على /register، ال إستمارة تسجيل() يجب أن يتعامل الأسلوب مع هذا الطلب عن طريق إعادة عرض التسجيل.

بعد أن ينقر الزائر على زر التسجيل ، ثم ملف تضمين التغريدة الشرح يدخل حيز التنفيذ. ال عملية التسجيل () تسمح لك الطريقة بنشر بيانات المستخدم التي تحصل عليها من ملف إستمارة تسجيل فئة إلى قاعدة البيانات ، باستخدام UserRepository فصل. ولكن قبل أن يخزن هذه البيانات ، فإن ملف عملية التسجيل () طريقة تشفير كلمة مرور المستخدم باستخدام الربيعPasswordEncoder واجهه المستخدم.

إنشاء تكوينات أمان جديدة

منذ Spring 3.1 ، يمكن للمطورين الآن إنشاء تكوينات لـ Spring Security باستخدام Java ، مما يعني الفئات بدلاً من XML. الشيء الرئيسي الذي تتطلبه فئات التكوين هذه هو @إعدادات حاشية. ملاحظة.

@Configuration
publicclassSecurityConfiguration{
}

ال @إعدادات يشير التعليق التوضيحي إلى أن الفئة أعلاه هي فئة تكوين. توفر هذه الفئات الفول إلى سياق تطبيق الربيع، وهي حاوية يستخدمها Spring لإنشاء وإدارة المكونات (أو الحبوب) المختلفة لأحد التطبيقات. الحبة الأولى في تكوين الأمن الطبقة هي كلمة المرور فاصوليا.

@Bean
public PasswordEncoder passwordEncoder(){
 returnnew BCryptPasswordEncoder();
}

ال RegisterController يستخدم الفصل كلمة المرور 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 ينبض الفاصوليا في الحركة.

عبر ال UserRepository، ال userDetailsService يكتسب فول الوصول إلى جميع العملاء الحاليين في قاعدة البيانات. تستخدم هذه الواجهة بعد ذلك ملف UserRepository لتحديد موقع مستخدم باسم مستخدم وكلمة مرور متطابقين ، ثم إرجاع جميع سمات هذا العميل ككائن.

إذا كان الكائن الذي تم إرجاعه هو عميل ، فسيحصل هذا العميل على حق الوصول إلى التطبيق. خلاف ذلك ، سيتم تحديث الصفحة تلقائيًا للسماح للمستخدم بإدخال بيانات اعتماد صالحة.

سلسلة التصفية

الربيع للأمنSecurityFilterChain واجهة مفيدة واجهة برمجة التطبيقات (API) التي تلعب دورًا أساسيًا في تكوين Spring Security. تعمل هذه الواجهة مع ملفات الربيع للأمنالأمن فئة لإنشاء سلسلة تصفية لطلبات 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 لإنجاز العديد من المهام. أولاً ، يستخدم ملف الأمن فئة لإملاء أن المستخدمين الذين لديهم دور المستخدم فقط هم من يمكنهم الوصول المضيف المحلي: 8080 / مستخدم. ويحصل المستخدم على هذا الدور بعد التسجيل ، وذلك بفضل getAuthorities () الطريقة التي ينفذها كل كائن عميل جديد.

@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
 return Arrays.asList(new SimpleGrantedAuthority("USER"));
}

تسمح سلسلة التصفية بالوصول غير المصدق إلى جميع عناوين URL الأخرى في التطبيق. ال عامل التصفية الفول يستخدم أيضا FormLogin () و تسجيل خروج() طرق الأمن كائن فئة.

تسمح لك هذه الطرق بتوجيه المستخدم تلقائيًا إلى صفحات معينة بعد قيامهم بمهمة ما. لذلك ، يقوم المستخدم بإدخال بيانات الاعتماد الصحيحة والنقر فوق زر تسجيل الدخول في ملف /login سيتم توجيه الصفحة تلقائيًا إلى /user صفحة.

وأخيرا، فإن عامل التصفية يبني الفول ويعيد سلسلة التصفية ، مما يسمح للمستخدمين المصرح لهم بالوصول إلى التطبيق. جميع الفاصوليا الثلاثة في تكوين الأمن يعمل الفصل معًا لتأمين تطبيقك.

ومع ذلك ، فإن عامل التصفية يلعب الفول دورًا أكثر أهمية في تحديد مستوى التفويض لـ كل طلب HTTP. عندما تبدأ في إضافة المزيد من الصفحات إلى التطبيق الخاص بك ، يمكنك استخدام امتداد عامل التصفية الفول لتعيين مستوى الأمان.

الميزة الرئيسية لأمن الربيع

يمنحك Spring Security التحكم الكامل ليس فقط في من لديه حق الوصول إلى التطبيق الخاص بك ، ولكن أيضًا نوع الوصول الذي يمكن أن يحصل عليه المستخدم (من خلال ميزة أدوار المستخدم الخاصة به). يعد التحكم في الوصول أحد أهم جوانب أي تطبيق. قد يكون منح المستخدمين العموميين وصولاً غير مصفي إلى تطبيقك بسبب حواجز التحكم في الوصول المحدودة خطأً مكلفًا.