Start Spring Security | شروع اسپرینگ سکیوریتی
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- Spring Security
یک فریمورک قدرتمند و قابلتوسعه در اکوسیستم اسپرینگ که وظیفه تامین امنیت برنامههای کاربردی، مدیریت احراز هویت (Authentication) و کنترل سطح دسترسی (Authorization) را بر عهده دارد.
spring-boot-starter-security
وابستگی استارتر در اسپرینگ بوت که با افزوده شدن به فایل ساخت (pom.xml)، به صورت خودکار (Autoconfiguration) امنیت پایه را روی تمامی مسیرهای HTTP برنامه فعال میکند.
PasswordEncoder
اینترفیسی در اسپرینگ سکیوریتی برای رمزنگاری و مقایسه امن رمزهای عبور که با متد matches() پسورد وارد شده توسط کاربر را با مقدار هششده در دیتابیس مقایسه میکند.
BCryptPasswordEncoder
یکی از قویترین و استانداردترین پیادهسازیهای رمزگذار رمز عبور که با استفاده از الگوریتم هشینگ قوی bcrypt امنیت کلمات عبور را تضمین میکند.
UserDetailsService
اینترفیسی کلیدی در اسپرینگ سکیوریتی شامل متد loadUserByUsername() که مسئول بارگذاری و بازیابی اطلاعات کاربر (UserDetails) بر اساس نام کاربری است.
InMemoryUserDetailsManager
پیادهسازی پیشفرضی از UserDetailsService که کاربران را به صورت موقت در حافظه رم (In-Memory) ذخیره میکند و بیشتر برای اهداف تستی یا برنامههای بسیار کوچک کاربرد دارد.
موارد مصاحبه ای
- پس از افزودن استارتر Spring Security به یک پروژه اسپرینگ بوت، رفتار پیشفرض برنامهی وب چگونه خواهد بود؟
به محض افزودن این وابستگی و راهاندازی برنامه، پیکربندی خودکار فعال شده و تمامی مسیرهای HTTP درخواست احراز هویت میکنند؛ صفحه لاگین پیشفرض نمایش داده میشود، نام کاربری به صورت پیشفرض user است و رمز عبور تصادفی آن در کنسول یا فایل لاگ برنامه چاپ میشود.
- چرا ذخیره پسوردها به صورت متن ساده (
Plain Text) در دیتابیس خطای امنیتی بحرانی محسوب میشود؟
زیرا در صورت نفوذ به پایگاه داده، تمام کلمات عبور کاربران افشا میشود. رمزگذارها با استفاده از توابع هش یکطرفه و تکنیک نمکپاشی (Salting) مانع از بازیابی پسورد اصلی میشوند و فرآیند مقایسه را به صورت امن در متد matches() انجام میدهند.
- تفاوت اصلی بین NoOpPasswordEncoder و BCryptPasswordEncoder چیست؟
کلاس NoOpPasswordEncoder هیچگونه رمزنگاری یا هشینگی اعمال نمیکند و برای محیط تولید کاملاً ناامن است، در حالی که BCryptPasswordEncoder با اعمال هشینگ قوی و تولید هشهای منحصربهفرد، استاندارد امنیتی مناسبی برای محیطهای واقعی فراهم میکند.
- محدودیت اصلی استفاده از In-Memory User Details Service در پروژههای واقعی چیست؟
این روش امکان مدیریت پویا، ثبتنام کاربران جدید و ویرایش اطلاعات حساب کاربری را فراهم نمیکند؛ هرگونه تغییر مستلزم ویرایش کد، بازسازی (Rebuild) و استقرار مجدد (Redeploy) برنامه است.
سناریو کاربردی
- راهاندازی پیکربندی اولیه امنیت و تعریف کاربران در حافظه موقت
در پروژههایی مانند سیستم سفارش تاکو (Taco Cloud)، برای شروع توسعه و تست سریع فرآیند ورود کاربران، یک کلاس پیکربندی امنیت (SecurityConfig) همراه با تعریف رمزگذار و کاربران تستی ایجاد میشود:
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public UserDetailsService userDetailsService(PasswordEncoder encoder) {
List<UserDetails> usersList = new ArrayList<>();
usersList.add(new User(
"buzz", encoder.encode("password"),
Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"))));
usersList.add(new User(
"woody", encoder.encode("password"),
Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"))));
return new InMemoryUserDetailsManager(usersList);
}
}
مراحل کار:
۱. ایجاد کلاس پیکربندی با انوتیشن @Configuration برای لغو تنظیمات پیشفرض امنیتی.
۲. تعریف PasswordEncoder از نوع BCryptPasswordEncoder به عنوان یک @Bean جهت رمزگذاری امن کلمات عبور.
۳. تعریف UserDetailsService به عنوان یک @Bean و تزریق رمزگذار برای ساخت کاربران نمونه (buzz و woody) با نقشهای مشخص و ثبت آنها در InMemoryUserDetailsManager.
بیشتر بدانید
- تست امنیت با حالت ناشناس مرورگر (Incognito Mode)
هنگام تست دستی قابلیتهای امنیتی و لاگین در مرورگر، همواره از پنجره Incognito یا Private Window استفاده کنید تا نشستهای قبلی (Sessions) و کوکیهای ذخیرهشده باعث ایجاد اختلال در سنجش تغییرات امنیتی جدید نشوند.
- وضعیت منسوخشدن StandardPasswordEncoder
رمزگذار StandardPasswordEncoder به دلیل عدم برخورداری از استانداردهای مدرن امنیتی و ضعف در برابر حملات کرک، منسوخ (Deprecated) شده است و نباید در پروژههای جدید تولیدی به کار گرفته شود.
