خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

چگونه برنامه Spring خود را با Spring Security ایمن کنید

با استفاده از ویژگی های قوی ارائه شده توسط چارچوب Spring Security، از امنیت برنامه Spring خود اطمینان حاصل کنید.

چارچوب امنیتی Spring برنامه شما را از طریق احراز هویت و مجوز ایمن می کند. در حالت پیش‌فرض، Spring Security تضمین می‌کند که هر مسیر (یا صفحه) درخواست HTTP در برنامه شما نیاز به احراز هویت یک کاربر سراسری دارد.

این چارچوب نیز بسیار انعطاف پذیر است. این به شما امکان می دهد قوانین امنیتی سفارشی برای هر مسیر درخواست HTTP در برنامه خود و همچنین کاربران مختلف ایجاد کنید. بنابراین، می توانید محدودیت امنیتی را در صفحاتی که نیازی به مجوز کاربر ندارند (مانند صفحه اصلی) حذف کنید. و نقش ها و اختیارات انواع کاربری خاص را تنظیم کنید.

افزودن امنیت Spring به برنامه شما

دو راه برای اضافه کردن Spring Security به برنامه شما وجود دارد. می‌توانید هنگام تولید یک برنامه Spring Boot جدید با استفاده از Spring initializr آن را به عنوان یک وابستگی انتخاب کنید یا پس از تولید پروژه خود آن را به فایل مشخصات ساخت خود در بخش وابستگی اضافه کنید.

اگر یکی از گزینه های پروژه Gradle را انتخاب کرده باشید، فایل وابستگی ها build.gradle است. با این حال، اگر Maven را انتخاب کردید، آن فایل pom.xml است.

فایل build.gradle شما باید دارای وابستگی زیر باشد:

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

در حالی که فایل pom.xml شما باید دارای وابستگی زیر باشد:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
</dependency>

نمونه برنامه مورد استفاده در مقاله در این مخزن GitHub موجود است و استفاده از آن تحت مجوز 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
public class WebController {
   
     @GetMapping("/")
      public String home() {
           return "Welcome!";
      }
}

اجرای برنامه شما پس از افزودن کلاس کنترلر واحد در بالا، نمای اولیه زیر را ایجاد می کند:

صفحه ورود به سیستم امنیت بهار

متوجه خواهید شد که به طور خودکار شما را به صفحه localhost:8080/login هدایت می کند، و قبل از اینکه به شما اجازه دسترسی به هر صفحه دیگر برنامه را بدهد، این کار را انجام می دهد. در این مرحله، باید نام کاربری پیش‌فرض (که همان کاربر است) و رمز عبور خودکار تولید شده (که در کنسول پیدا خواهید کرد) را ارائه کنید. کنسول خطی مانند شکل زیر ایجاد می کند:

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

هر بار که برنامه خود را مجدداً راه اندازی می کنید رمز عبور ایجاد شده به طور خودکار تغییر می کند، اما نام کاربری ثابت می ماند. با وارد کردن نام کاربری و رمز عبور پیش فرض شما را به نمای مناسب در برنامه خود هدایت می کند.

مطلب مرتبط:   چگونه از Native CSS Nesting در برنامه های وب خود استفاده کنید

سفارشی کردن امنیت بهار

برای سفارشی کردن امنیت برنامه خود، باید پیکربندی پیش فرض Spring Security را لغو کنید. اما قبل از آن (با فرض اینکه قبلاً Spring Web دارید) به چندین وابستگی دیگر برای این نمونه برنامه نیاز دارید:

  • بهار داده JPA
  • درایور MySQL JDBC
  • برگ آویشن
  • لومبوک

چارچوب Thymeleaf نماهای مختلفی ایجاد می کند. Lombok به کاهش کد در کلاس های شی کمک می کند. کتابخانه JPA و درایور MySQL به شما این امکان را می دهد که از پایگاه داده MySQL با برنامه استفاده کنید، اما شما می توانید از هر پایگاه داده ای که با آن راحت هستید استفاده کنید. استفاده از پایگاه داده به معنای پیکربندی فایل applications.properties در زیر فایل منابع است.

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 به نام Spring_security با نام کاربری ریشه و رمز عبور (1234) متصل شوید. شما باید این داده ها را برای مطابقت با نام پایگاه داده و اعتبارنامه خود به روز کنید.

پس از افزودن وابستگی های اضافی و ایجاد پایگاه داده خود، می توانید تصمیم بگیرید که برنامه شما چند بازدید داشته باشد. همچنین باید بدانید که امنیت هر صفحه چگونه است. برنامه نمونه ما 6 بازدید دارد:

  • صفحه نخست
  • صفحه ثبت نام
  • صفحه ورود
  • صفحه خروج
  • صفحه کاربر
  • صفحه خطا

تنها نمایی که نیاز به مجوز کاربر دارد، صفحه کاربر است. این صفحه فقط برای کاربرانی قابل دسترسی است که ابتدا ثبت نام کرده و سپس وارد برنامه می شوند. علاوه بر بسته پیش‌فرض Spring Boot، باید چهار بسته دیگر در برنامه خود ایجاد کنید.

کلاس کنترل کننده ثبت نام

بسته کنترل کننده شامل کلاس هایی خواهد بود که درخواست های HTTP را مدیریت می کنند. بسته به عملکرد یک صفحه، معمولاً می توانید هر درخواست HTTP را در یک کلاس کنترلر گروه بندی کنید، همانطور که در کلاس WebController وجود دارد. با این حال، نمای ثبت دارای عملکردهای منحصر به فرد بیشتری است، بنابراین، می تواند یک کلاس کنترل کننده خصوصی داشته باشد:

@Controller
@RequestMapping("/register")
public class RegistrationController {
       private UserRepository userRepo;
       private PasswordEncoder passwordEncoder;
       
       public RegistrationController( 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 یک دروازه برای جنبه امنیتی برنامه شما است. حاشیه نویسی RequestMapping@ نوع درخواستی را که این کنترلر انجام خواهد داد (درخواست به localhost:8080/register) مشخص می کند.

مطلب مرتبط:   چگونه داده های IMDb را با پایتون و سینماگور استخراج کنیم

حاشیه نویسی @GetMapping به سادگی نشان می دهد که اگر برنامه درخواستی برای /register دریافت کند، متد registerForm() باید با بازگرداندن نمای ثبت نام، آن درخواست را مدیریت کند.

پس از اینکه بازدیدکننده روی دکمه ثبت کلیک کرد، حاشیه نویسی @PostMapping وارد عمل می شود. متد processRegistration() به شما امکان می دهد داده های کاربری را که از کلاس RegistrationForm دریافت می کند با استفاده از کلاس UserRepository به پایگاه داده ارسال کنید. اما قبل از اینکه این داده ها را ذخیره کند، متد processRegistration () رمز عبور کاربر را با استفاده از رابط Spring’s PasswordEncoder رمزگذاری می کند.

ایجاد تنظیمات امنیتی جدید

از بهار 3.1، توسعه دهندگان اکنون می توانند با استفاده از جاوا پیکربندی هایی را برای Spring Security ایجاد کنند، که به معنای کلاس ها به جای XML است. اصلی‌ترین چیزی که این کلاس‌های پیکربندی به آن نیاز دارند، حاشیه‌نویسی @Configuration است.

@Configuration
public class SecurityConfiguration {
}

حاشیه‌نویسی @Configuration نشان می‌دهد که کلاس بالا یک کلاس پیکربندی است. این کلاس‌ها beans را در زمینه برنامه کاربردی Spring ارائه می‌کنند، که ظرفی است که Spring برای ایجاد و مدیریت اجزای مختلف (یا beans) یک برنامه کاربردی استفاده می‌کند. اولین Bean در کلاس SecurityConfiguration bean passwordEncoder است.

@Bean
public PasswordEncoder passwordEncoder() {
 return new BCryptPasswordEncoder();
}

کلاس RegistrationController از passwordEncoder bean برای رمزگذاری رمزهای عبور جدید قبل از ذخیره آنها در پایگاه داده استفاده می کند. دانه مهم دیگری که باید به کلاس SecurityConfiguration اضافه کنید، userDetailsService bean است.

@Bean
public UserDetailsService userDetailsService(UserRepository userRepo) {
 return username -> {
   Customer customer = userRepo.findByUsername(username);
     if (customer != null)
           return customer;
     throw new UsernameNotFoundException("Customer '" + username + "' not found");
 };
}

لوبیای userDetailsService از رابط کاربری Spring Security’s UserDetailsService برای بازیابی نام کاربری و رمز عبور کاربر برای احراز هویت، در طول جلسه ورود مشتری استفاده می کند. بنابراین، به محض اینکه مشتری روی دکمه ورود در نمای ورود کلیک می کند، لوبیا userDetailsService به حرکت در می آید.

از طریق UserRepository، لوبیا userDetailsService به تمام مشتریان موجود در پایگاه داده دسترسی پیدا می کند. سپس این رابط از UserRepository برای یافتن کاربری با نام کاربری و رمز عبور منطبق استفاده می‌کند، سپس تمام ویژگی‌های این مشتری را به عنوان یک شی برمی‌گرداند.

اگر شیء برگشتی مشتری باشد، این مشتری به برنامه دسترسی پیدا می کند. در غیر این صورت، صفحه به‌طور خودکار بازخوانی می‌شود و به کاربر اجازه می‌دهد اعتبارنامه‌های معتبر را وارد کند.

مطلب مرتبط:   چرا آنتی ویروس ها از اسکن محروم هستند؟

زنجیره فیلتر

رابط SecurityFilterChain Spring Security یک رابط برنامه نویسی کاربردی کاربردی (API) است که نقش اساسی در پیکربندی Spring Security ایفا می کند. این رابط با کلاس HttpSecurity 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();
}

فیلتر Chain bean بالا از SecurityFilterChain API برای انجام چندین کار استفاده می کند. ابتدا، از کلاس HttpSecurity استفاده می کند تا حکم کند که فقط کاربرانی که نقش USER دارند می توانند به localhost:8080/user دسترسی داشته باشند. و یک کاربر این نقش را پس از ثبت نام، به لطف متد getAuthorities() که هر شیء مشتری جدید پیاده سازی می کند، دریافت می کند.

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

زنجیره فیلتر امکان دسترسی بدون احراز هویت به همه URL های دیگر در برنامه را می دهد. دانه filterChain همچنین از متدهای formLogin() و logout() شی کلاس HttpSecurity استفاده می کند.

این روش ها به شما این امکان را می دهند که کاربر را پس از انجام یک کار به طور خودکار به صفحات خاصی هدایت کنید. بنابراین، کاربری که اطلاعات کاربری صحیح را وارد کرده و روی دکمه ورود در صفحه /login کلیک کند، به طور خودکار به صفحه /user هدایت می شود.

در نهایت، filterChain bean زنجیره فیلتر را می سازد و برمی گرداند، که به کاربران مجاز اجازه می دهد تا به برنامه دسترسی داشته باشند. هر سه دانه در کلاس SecurityConfiguration با هم کار می کنند تا برنامه شما را ایمن کنند.

با این حال، filterChain bean نقش مهمتری را در تعیین سطح مجوز برای هر درخواست HTTP ایفا می کند. همانطور که شروع به اضافه کردن صفحات بیشتری به برنامه خود می کنید، می توانید از filterChain bean برای تنظیم سطح امنیتی آنها استفاده کنید.

مزیت اصلی امنیت بهار

Spring Security به شما کنترل کامل نه تنها بر روی افرادی که به برنامه شما دسترسی دارند، بلکه بر نوع دسترسی کاربر نیز می دهد (از طریق ویژگی نقش های کاربری آن). کنترل دسترسی یکی از مهمترین جنبه های هر برنامه کاربردی است. دادن دسترسی بدون فیلتر به کاربران عمومی به دلیل موانع کنترل دسترسی محدود ممکن است اشتباه پرهزینه ای باشد.