Spring Security 6 और JWT प्रमाणीकरण · पाठ

HttpSecurity कॉन्फ़िगरेशन की गहन जानकारी

विभिन्न HTTP अनुरोधों और एंडपॉइंट के लिए सुरक्षा नियम निर्धारित करने हेतु `HttpSecurity` कॉन्फ़िगरेशन में दक्षता प्राप्त करें।

पाठ 3, कुल 4 में से11 चरण

HttpSecurity कॉन्फ़िगरेशन की गहन जानकारी, CoddyKit पर Spring Security 6 और JWT प्रमाणीकरण का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Spring Security 6 और JWT प्रमाणीकरण सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Spring Security 6 और JWT प्रमाणीकरण पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

HttpSecurity क्या है?

HttpSecurity Spring Security का एक मुख्य घटक है। यह आपके वेब अनुप्रयोग के दरवाज़ों पर तैनात सुरक्षा प्रहरी जैसा है।

यह आपको अलग-अलग HTTP अनुरोधों के लिए नियम परिभाषित करने देता है और नियंत्रित करता है कि आपके अनुप्रयोग के किन हिस्सों तक कौन और किन परिस्थितियों में पहुँच सकता है।

  • प्रमाणीकरण: आप कौन हैं? (क्या आपने लॉग इन किया है?)
  • प्राधिकरण: आपको क्या करने की अनुमति है? (क्या आपके पास अनुमति है?)

आपकी पहली सुरक्षा श्रृंखला

आप HttpSecurity को SecurityFilterChain बीन के भीतर कॉन्फ़िगर करते हैं। यह बीन उन फ़िल्टरों की श्रृंखला परिभाषित करता है जिनका उपयोग Spring Security आपके अनुप्रयोग को सुरक्षित करने के लिए करता है।

यहाँ एक न्यूनतम सेटअप दिया गया है। इसे चलाएँ और /hello तक पहुँचने का प्रयास करें। आपको लॉगिन पृष्ठ पर भेज दिया जाएगा!

उपयोगकर्ता नाम: user, पासवर्ड: password इस्तेमाल करें।

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SecurityApp {

    public static void main(String[] args) {
        SpringApplication.run(SecurityApp.class, args);
    }

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, secured world!";
    }
}

@Configuration
@EnableWebSecurity
class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated() // All requests need authentication
            )
            .formLogin(form -> form
                .permitAll() // Allow everyone to see the login page
            )
            .logout(logout -> logout
                .permitAll()); // Allow everyone to logout
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

अभिगम नियम सेट करना

.authorizeHttpRequests() विधि वह स्थान है जहाँ से आप अपने अनुप्रयोग के URL के लिए प्राधिकरण नियम परिभाषित करना शुरू करते हैं।

इसके लैम्ब्डा के भीतर आप उन पैटर्न और उन पैटर्न के लिए अभिगम आवश्यकताएँ निर्दिष्ट करते हैं। इसे सुरक्षा प्रहरी को यह बताने जैसा समझें: "इस पथ के लिए ये नियम लागू करें।"

यह विधि श्रृंखला SecurityFilterChain बीन का हिस्सा है।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

// This snippet shows the core authorizeHttpRequests() part.
// It assumes the surrounding Spring Boot application and 
// SecurityConfig class from the previous scene.

@Configuration
@EnableWebSecurity
class SecurityConfigSnippet {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                // Your specific rules go here!
                // Example: .requestMatchers("/public/**").permitAll()
                // Example: .anyRequest().authenticated()
            )
            .formLogin(form -> form.permitAll())
            .logout(logout -> logout.permitAll());
        return http.build();
    }
}

सार्वजनिक और प्रतिबंधित पथ

आप ऐसे पथ परिभाषित कर सकते हैं जिन तक हर कोई पहुँच सके (permitAll()) या जिन तक बिल्कुल कोई न पहुँच सके (denyAll())।

URL पैटर्न निर्दिष्ट करने के लिए requestMatchers() का उपयोग करें। याद रखें, नियम क्रम से संसाधित होते हैं, इसलिए अधिक विशिष्ट नियम पहले आने चाहिए।

इस अनुप्रयोग को चलाएँ और पहले /public, फिर /private (user/password से लॉग इन करके), और उसके बाद /secret आज़माएँ।

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class PublicPrivateApp {

    public static void main(String[] args) {
        SpringApplication.run(PublicPrivateApp.class, args);
    }

    @GetMapping("/public")
    public String publicContent() {
        return "This is public content!";
    }

    @GetMapping("/private")
    public String privateContent() {
        return "This is private content!";
    }

    @GetMapping("/secret")
    public String secretContent() {
        return "Top secret! No one allowed here.";
    }
}

@Configuration
@EnableWebSecurity
class SecurityConfigPublicPrivate {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/public/**").permitAll() // Anyone can access
                .requestMatchers("/secret/**").denyAll()   // No one can access
                .anyRequest().authenticated()              // All other requests need login
            )
            .formLogin(form -> form.permitAll())
            .logout(logout -> logout.permitAll());
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

केवल लॉग इन किए हुए उपयोगकर्ता

.authenticated() विधि यह सुनिश्चित करने के लिए उपयोग की जाती है कि किसी विशिष्ट पथ तक पहुँचने से पहले उपयोगकर्ता सफलतापूर्वक लॉग इन कर चुका हो।

यह आपके अनुप्रयोग के उस प्रत्येक हिस्से के लिए एक मूलभूत नियम है जहाँ उपयोगकर्ता की पहचान आवश्यक होती है, जैसे डैशबोर्ड या प्रोफ़ाइल पृष्ठ।

// Inside your SecurityFilterChain configuration:
http
    .authorizeHttpRequests(auth -> auth
        .requestMatchers("/login", "/register").permitAll() // Public paths
        .requestMatchers("/dashboard/**").authenticated() // Needs login
        .anyRequest().denyAll() // Deny everything else by default
    )
    // ... other http configurations (formLogin, logout) ...

उपयोगकर्ता की भूमिकाओं के आधार पर प्रतिबंध

आप .hasRole("ROLENAME") या .hasAuthority("ROLE_ROLENAME") का उपयोग करके उपयोगकर्ता की भूमिका के आधार पर अभिगम दे सकते हैं। hasRole() का उपयोग करते समय Spring Security भूमिकाओं के आगे अपने-आप "ROLE_" जोड़ देता है।

इससे संवेदनशील संसाधनों तक किसे पहुँच मिल सकती है, इस पर सूक्ष्म नियंत्रण मिलता है। इस अनुप्रयोग को चलाएँ। /user-dashboard तक पहुँचने के लिए 'user' (पासवर्ड 'password') से और /admin-panel तक पहुँचने के लिए 'admin' (पासवर्ड 'admin') से लॉग इन करें।

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class RoleBasedApp {

    public static void main(String[] args) {
        SpringApplication.run(RoleBasedApp.class, args);
    }

    @GetMapping("/home")
    public String home() { return "Welcome!"; }

    @GetMapping("/user-dashboard")
    public String userDashboard() { return "User Dashboard!"; }

    @GetMapping("/admin-panel")
    public String adminPanel() { return "Admin Panel!"; }
}

@Configuration
@EnableWebSecurity
class SecurityConfigRoles {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/home").permitAll()
                .requestMatchers("/user-dashboard").hasRole("USER") // Only users with ROLE_USER
                .requestMatchers("/admin-panel").hasRole("ADMIN")   // Only users with ROLE_ADMIN
                .anyRequest().authenticated() // All others need login
            )
            .formLogin(form -> form.permitAll())
            .logout(logout -> logout.permitAll());
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        UserDetails admin = User.withDefaultPasswordEncoder()
            .username("admin")
            .password("admin")
            .roles("ADMIN")
            .build();
        return new InMemoryUserDetailsManager(user, admin);
    }
}

नियमों का क्रम अत्यंत महत्वपूर्ण है

requestMatchers() के साथ कई नियम परिभाषित करते समय उनका क्रम महत्वपूर्ण होता है! Spring Security उन्हें ऊपर से नीचे तक संसाधित करता है और सबसे पहले मेल खाने वाला नियम लागू करता है।

  • सबसे विशिष्ट पहले: विशिष्ट URL पैटर्न (जैसे /api/admin/users) को अधिक व्यापक पैटर्न (जैसे /api/admin/**) से पहले रखें।
  • सर्वसमावेशी नियम सबसे अंत में: .anyRequest() मैचर लगभग हमेशा अंतिम नियम होना चाहिए और पहले से मेल न खाने वाली हर चीज़ के लिए डिफ़ॉल्ट के रूप में काम करना चाहिए।
// Incorrect order example (the second rule is unreachable):
// auth
//   .requestMatchers("/admin/**").authenticated()
//   .requestMatchers("/admin/public").permitAll() 

// Correct order example:
// auth
//   .requestMatchers("/admin/public").permitAll()
//   .requestMatchers("/admin/**").hasRole("ADMIN")
//   .anyRequest().authenticated()

फ़ॉर्म लॉगिन कॉन्फ़िगर करना

Spring Security एक डिफ़ॉल्ट लॉगिन पृष्ठ उपलब्ध कराता है। आप HttpSecurity के भीतर .formLogin() का उपयोग करके इसके व्यवहार को अनुकूलित कर सकते हैं।

मुख्य कॉन्फ़िगरेशन में लॉगिन पृष्ठ का URL, लॉगिन डेटा संसाधित करने वाला URL और सफलता या विफलता के बाद पुनर्निर्देशित किए जाने का स्थान शामिल हैं।

// Inside your SecurityFilterChain configuration:
http
    .authorizeHttpRequests(auth -> auth
        .anyRequest().authenticated()
    )
    .formLogin(form -> form
        .loginPage("/custom-login")      // Specify custom login page URL
        .loginProcessingUrl("/authenticate") // URL to submit login data
        .defaultSuccessUrl("/dashboard", true) // Redirect after success
        .failureUrl("/custom-login?error")  // Redirect on failure
        .permitAll() // Allow access to login page and its processing
    )
    .logout(logout -> logout.permitAll());

क्रॉस-साइट अनुरोध जालसाजी (CSRF)

CSRF एक ऐसा हमला है जिसमें कोई दुर्भावनापूर्ण वेबसाइट उपयोगकर्ता के ब्राउज़र को किसी अन्य विश्वसनीय साइट पर अनचाहा अनुरोध भेजने के लिए धोखा देती है, जहाँ उपयोगकर्ता प्रमाणित होता है।

Spring Security स्थिति-आधारित अनुप्रयोगों के लिए डिफ़ॉल्ट रूप से मजबूत CSRF सुरक्षा उपलब्ध कराता है।

  • डिफ़ॉल्ट रूप से सक्षम: POST, PUT, DELETE अनुरोधों के लिए एक अद्वितीय टोकन आवश्यक होता है।
  • सावधानी से अक्षम करें: .csrf().disable() का उपयोग केवल स्थिति-रहित API (जैसे JWT का उपयोग करने वाले REST API) के लिए या तब करें जब आपके पास CSRF सुरक्षा का कोई अन्य उपाय हो।
// Inside your SecurityFilterChain configuration:
http
    // ... authorization rules ...
    .csrf(csrf -> csrf.disable()) // ONLY disable if you know what you're doing!
                                  // Common for stateless REST APIs.
    // ... formLogin, logout ...
;

HttpSecurity कॉन्फ़िगरेशन जाँच

आप एक Spring Boot अनुप्रयोग बना रहे हैं। आपको यह करना है:

  • /api/public/** तक सार्वजनिक अभिगम की अनुमति देनी है।
  • ADMIN भूमिका वाले उपयोगकर्ताओं के लिए /api/admin/** तक अभिगम आवश्यक करना है।
  • अन्य सभी अनुरोधों के लिए किसी भी प्रमाणित उपयोगकर्ता की आवश्यकता होनी चाहिए।

निम्नलिखित में से कौन-सी कॉन्फ़िगरेशन इन आवश्यकताओं को सही ढंग से पूरा करती हैं? (सभी लागू विकल्प चुनें)

HttpSecurity का गहन पुनरावलोकन

बहुत अच्छा! आपने HttpSecurity कॉन्फ़िगरेशन की आवश्यक बातें सीख ली हैं।

हमने इन विषयों को शामिल किया:

  • वेब सुरक्षा नियम परिभाषित करने में HttpSecurity की भूमिका।
  • पथ-आधारित प्राधिकरण के लिए .authorizeHttpRequests() का उपयोग।
  • .permitAll(), .denyAll(), .authenticated() और .hasRole() जैसी विधियाँ।
  • कई अभिगम नियम परिभाषित करते समय नियमों के क्रम का महत्व।
  • कस्टम लॉगिन पृष्ठों के लिए .formLogin() कॉन्फ़िगर करना।
  • CSRF सुरक्षा को समझना और प्रबंधित करना।

मजबूत और सुरक्षित Spring Boot अनुप्रयोग बनाने के लिए ये कौशल अत्यंत महत्वपूर्ण हैं!

शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
12
पाठ
48

अक्सर पूछे जाने वाले प्रश्न

क्या “HttpSecurity कॉन्फ़िगरेशन की गहन जानकारी” पाठ निःशुल्क है?

हाँ — Spring Security 6 और JWT प्रमाणीकरण अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “HttpSecurity कॉन्फ़िगरेशन की गहन जानकारी” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Spring Security 6 और JWT प्रमाणीकरण पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“HttpSecurity कॉन्फ़िगरेशन की गहन जानकारी” में मैं क्या सीखूँगा?

विभिन्न HTTP अनुरोधों और एंडपॉइंट के लिए सुरक्षा नियम निर्धारित करने हेतु `HttpSecurity` कॉन्फ़िगरेशन में दक्षता प्राप्त करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Spring Security 6 और JWT प्रमाणीकरण का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Spring Security 6 और JWT प्रमाणीकरण शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Spring Security 6 और JWT प्रमाणीकरण शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“HttpSecurity कॉन्फ़िगरेशन की गहन जानकारी” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Spring Security 6 और JWT प्रमाणीकरण पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Spring Security 6 और JWT प्रमाणीकरण पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. भूमिका-आधारित पहुँच नियंत्रण (RBAC)
  2. एनोटेशन के साथ मेथड-स्तरीय सुरक्षा
  3. HttpSecurity कॉन्फ़िगरेशन की गहन जानकारी
  4. कस्टम पहुँच नियमों से endpoint सुरक्षित करना
← Spring Security 6 और JWT प्रमाणीकरण पर वापस जाएँ