جلسه شماره 146رایگان

Start Spring Security | شروع اسپرینگ سکیوریتی

00:31:29

توضیحات جلسه

🎥 این ویدیو قسمت صد و بیست و سوم از بوت‌کمپ رایگان جاوا و قسمت بیست‌ودوم از پلی‌لیست آموزش Spring است. 📚 در این جلسه شروع آموزش Spring Security را داریم؛ یکی از بخش‌های مهم توسعه برنامه‌های امن با فریم‌ورک Spring. ابتدا بررسی می‌کنیم چرا امنیت در برنامه‌های وب اهمیت دارد و سپس Spring Security را در پروژه فعال می‌کنیم تا با رفتار پیش‌فرض آن آشنا شویم. در ادامه، نحوه ورود با اطلاعات کاربری پیش‌فرض، امکانات امنیتی اولیه، تنظیم Password Encoder و اهمیت رمزنگاری گذرواژه کاربران را بررسی می‌کنیم. سپس با UserDetailsService و پیاده‌سازی کاربران در حافظه با InMemoryUserDetailsService آشنا می‌شویم. در این جلسه یاد می‌گیریم: 🔐 چرا امنیت در برنامه‌های کاربردی اهمیت دارد ⚙️ فعال‌سازی Spring Security در پروژه 🕵️ آزمایش صفحه ورود با پنجره ناشناس مرورگر (Incognito) 👤 آشنایی با نام کاربری و گذرواژه پیش‌فرض Spring Security 🛡️ بررسی قابلیت‌های امنیتی پیش‌فرض Spring Security 🔑 پیکربندی Password Encoder و انتخاب رمزگذار مناسب 🔒 چرا نباید گذرواژه کاربران را به‌صورت خام ذخیره کنیم 🧩 آشنایی با Bean از نوع UserDetailsService 💾 پیاده‌سازی InMemoryUserDetailsService برای تعریف کاربران در حافظه 🧠 در پایان، نکات اصلی جلسه را مرور می‌کنیم و برای ادامه مسیر آموزش Spring Security آماده می‌شویم. اگر در حال یادگیری جاوا و Spring Boot هستید، آشنایی با Spring Security و اصول مدیریت کاربران و گذرواژه‌ها، قدم مهمی برای ساخت برنامه‌های امن و آماده استفاده در پروژه‌های واقعی است. 📌 یوتیوب: https://youtube.com/@farzadafi 📌 آپارات: https://aparat.com/farzadafi 📌 وب‌سایت: https://farzadafi.ir 📌 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi هر سوالی داشته باشید می‌توانید در این گروه‌ها بپرسید تا من یا مربی‌های گروه کمکتان کنیم 💬 🎯 بوت‌کمپ رایگان جاوا – آموزش پروژه‌محور برای یادگیری عمیق جاوا و آمادگی ورود به بازار کار.

جزوه و مستندات

مفاهیم کلیدی

  • 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) شده است و نباید در پروژه‌های جدید تولیدی به کار گرفته شود.