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

कस्टम JWT फ़िल्टर लागू करना

अनुरोधों को रोकने, JWT निकालने और उपयोगकर्ताओं का प्रमाणीकरण करने के लिए कस्टम `OncePerRequestFilter` बनाएँ।

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

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

कस्टम JWT फ़िल्टर क्यों?

प्रमाणीकरण के लिए JSON Web Tokens (JWT) का उपयोग करते समय Spring Security स्वाभाविक रूप से यह नहीं जानता कि उन्हें कैसे संसाधित करना है। यहीं कस्टम फ़िल्टर उपयोगी होता है!

कस्टम JWT फ़िल्टर आने वाले अनुरोधों को रोककर:

  • JWT निकालता है।
  • उसकी प्रामाणिकता और समय-सीमा की जाँच करता है।
  • Spring Security को प्रमाणित उपयोगकर्ता के बारे में सूचित करता है।

OncePerRequestFilter का आधार

अपने कस्टम JWT फ़िल्टर के लिए हम Spring के OncePerRequestFilter का विस्तार करेंगे। यह आधार वर्ग सुनिश्चित करता है कि प्रत्येक HTTP अनुरोध के लिए आपके फ़िल्टर का तर्क ठीक एक बार चले, जिससे अनावश्यक संसाधन-प्रसंस्करण रुकता है।

  • यह फ़िल्टर का कार्यान्वयन सरल बनाता है।
  • प्रत्येक अनुरोध के लिए दक्षता सुनिश्चित करता है।
  • यह प्रमाणीकरण तर्क के लिए आदर्श है।

फ़िल्टर की मूल संरचना

OncePerRequestFilter का विस्तार करने वाले प्रत्येक कस्टम फ़िल्टर को doFilterInternal विधि को ओवरराइड करना आवश्यक है। यहीं हमारा JWT संसाधन-प्रसंस्करण तर्क रहेगा।

यह अनुरोध को आगे भेजने के लिए HttpServletRequest, HttpServletResponse और FilterChain तक पहुँच प्रदान करता है।

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;

public class JwtAuthenticationFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(
        HttpServletRequest request,
        HttpServletResponse response,
        FilterChain filterChain
    ) throws ServletException, IOException {
        // Our JWT logic will go here
        filterChain.doFilter(request, response);
    }
}

JWT निकालना

हमारे फ़िल्टर का पहला चरण आने वाले अनुरोध से JWT निकालना है। JWT आमतौर पर Authorization शीर्षलेख में Bearer उपसर्ग के साथ भेजे जाते हैं।

हमें इस शीर्षलेख की जाँच करनी होती है और वास्तविक टोकन प्राप्त करने के लिए ‘Bearer ’ भाग हटाना होता है।

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;

public class JwtAuthenticationFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(
        HttpServletRequest request,
        HttpServletResponse response,
        FilterChain filterChain
    ) throws ServletException, IOException {
        final String authHeader = request.getHeader("Authorization");
        String jwt = null;

        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            jwt = authHeader.substring(7); // Remove "Bearer " prefix
            System.out.println("Extracted JWT: " + jwt.substring(0, 5) + "...");
        } else {
            System.out.println("No JWT found or invalid header.");
        }

        filterChain.doFilter(request, response);
    }
}

सत्यापन और पार्सिंग (अवधारणा)

निकालने के बाद JWT का सत्यापन करना आवश्यक है। इसमें शामिल हैं:

  • हस्ताक्षर सत्यापन: यह सुनिश्चित करना कि टोकन के साथ छेड़छाड़ नहीं की गई है।
  • समय-सीमा जाँच: यह पुष्टि करना कि टोकन अभी भी मान्य है।
  • दावा निष्कर्षण: टोकन के पेलोड से उपयोगकर्ता नाम (विषय) जैसी जानकारी प्राप्त करना।

यह सत्यापन आमतौर पर समर्पित JwtService या इसी प्रकार की उपयोगिता द्वारा संभाला जाता है, जिसका उपयोग हमारा फ़िल्टर करेगा।

उपयोगकर्ता विवरण लोड करना (अवधारणा)

JWT का सत्यापन हो जाने और उपयोगकर्ता नाम (या उपयोगकर्ता ID) निकाल लिए जाने के बाद, फ़िल्टर को उपयोगकर्ता के विशिष्ट विवरण लोड करने होते हैं। यह आमतौर पर Spring Security की UserDetailsService का उपयोग करके किया जाता है।

UserDetailsService UserDetails ऑब्जेक्ट प्राप्त करता है, जिसमें प्राधिकरण के लिए आवश्यक भूमिकाएँ और अधिकार जैसी जानकारी होती है।

प्रमाणीकरण संदर्भ सेट करना

अंतिम महत्वपूर्ण चरण Spring Security को यह बताना है कि वर्तमान अनुरोध के लिए उपयोगकर्ता प्रमाणित है। इसके लिए एक Authentication ऑब्जेक्ट (जैसे, UsernamePasswordAuthenticationToken) बनाया जाता है और उसे SecurityContextHolder में सेट किया जाता है।

सेट हो जाने के बाद, Spring Security अनुरोध की अवधि तक उपयोगकर्ता को प्रमाणित मानेगा।

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // Simulate a UserDetails object loaded from DB
        UserDetails userDetails = new User(
            "exampleUser", "[PASSWORD_HASH]", new ArrayList<>()
        );

        // Create an Authentication token
        UsernamePasswordAuthenticationToken authToken =
            new UsernamePasswordAuthenticationToken(
                userDetails, null, userDetails.getAuthorities()
            );

        // Set the Authentication in the SecurityContextHolder
        SecurityContextHolder.getContext().setAuthentication(authToken);

        System.out.println("Authentication set for: " +
            SecurityContextHolder.getContext().getAuthentication().getName());

        // Clear context after request (or for next test)
        SecurityContextHolder.clearContext();
    }
}

चलने योग्य फ़िल्टर तर्क का उदाहरण

आइए, एक सरल, चलने योग्य उदाहरण देखें, जो हमारे कस्टम JWT फ़िल्टर के मूल तर्क की नकल करता है। यह टोकन निकालने और उसकी मौजूदगी के आधार पर प्रमाणीकरण सेट करने का अनुकरण करता है।

यह उदाहरण पूर्ण Spring Boot सेटअप के बिना प्रवाह दिखाने के लिए नकली घटकों का उपयोग करता है।

import java.util.HashMap;
import java.util.Map;

// Simulate Spring Security components needed for the filter logic
class MockSecurityContextHolder {
    private static String authenticatedUser = null;

    public static String getAuthentication() {
        return authenticatedUser;
    }

    public static void setAuthentication(String user) {
        authenticatedUser = user;
    }

    public static void clearContext() {
        authenticatedUser = null;
    }
}

public class Main {

    // This method simulates the core logic of doFilterInternal
    public static void simulateJwtFilter(Map<String, String> requestHeaders) {
        System.out.println("--- Simulating JWT Filter Logic ---");

        final String authHeader = requestHeaders.get("Authorization");
        String jwt = null;
        String username = null;

        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            jwt = authHeader.substring(7);
            // In a real app, this extracts username from JWT payload
            username = "coddyuser"; // Simplified: assume "coddyuser" from a valid JWT
            System.out.println("Filter: JWT found: " + jwt.substring(0, 5) + "...");
        } else {
            System.out.println("Filter: No JWT found or invalid header format.");
        }

        // Check if user is already authenticated
        if (username != null && MockSecurityContextHolder.getAuthentication() == null) {
            // Simulate JWT validation (signature, expiration, etc.)
            boolean tokenValid = true; // Assume valid for this simple demo

            if (tokenValid) {
                // In a real filter, we'd load UserDetails and create an Authentication object
                MockSecurityContextHolder.setAuthentication(username);
                System.out.println("Filter: User '" + username + "' authenticated and context set.");
            } else {
                System.out.println("Filter: JWT validation failed.");
            }
        } else if (username != null && MockSecurityContextHolder.getAuthentication() != null) {
            System.out.println("Filter: User '" + username + "' already authenticated for this request.");
        }

        // In a real filter, this would call filterChain.doFilter(...)
        System.out.println("Filter: Request passed to next filter/handler.");
        System.out.println("--- Filter Logic End ---");
    }

    public static void main(String[] args) {
        // Scenario 1: Request with a valid JWT
        Map<String, String> headers1 = new HashMap<>();
        headers1.put("Authorization", "Bearer abc.def.ghi");
        simulateJwtFilter(headers1);
        System.out.println("Main: SecurityContext has authentication: " +
            (MockSecurityContextHolder.getAuthentication() != null ? MockSecurityContextHolder.getAuthentication() : "None"));
        MockSecurityContextHolder.clearContext(); // Clean up

        System.out.println("\n");

        // Scenario 2: Request without a JWT
        Map<String, String> headers2 = new HashMap<>();
        simulateJwtFilter(headers2);
        System.out.println("Main: SecurityContext has authentication: " +
            (MockSecurityContextHolder.getAuthentication() != null ? MockSecurityContextHolder.getAuthentication() : "None"));
        MockSecurityContextHolder.clearContext(); // Clean up
    }
}

Spring Security के साथ एकीकरण

JwtAuthenticationFilter बनाने के बाद, हमें इसे Spring Security की फ़िल्टर शृंखला में पंजीकृत करना होगा। यह आमतौर पर HttpSecurity का उपयोग करके आपकी सुरक्षा विन्यास वर्ग (जैसे, SecurityConfig) में किया जाता है।

हम .addFilterBefore() का उपयोग यह सुनिश्चित करने के लिए करते हैं कि हमारा JWT फ़िल्टर Spring Security के डिफ़ॉल्ट प्रमाणीकरण फ़िल्टरों, जैसे UsernamePasswordAuthenticationFilter, से पहले चले।

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;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

// Assuming JwtAuthenticationFilter is defined elsewhere
class JwtAuthenticationFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, jakarta.servlet.FilterChain filterChain) throws jakarta.servlet.ServletException, java.io.IOException {
        // Simplified for config demo
        filterChain.doFilter(request, response);
    }
}

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private final JwtAuthenticationFilter jwtAuthFilter;

    // Inject our custom JWT filter
    public SecurityConfig(JwtAuthenticationFilter jwtAuthFilter) {
        this.jwtAuthFilter = jwtAuthFilter;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable()) // Disable CSRF for stateless APIs
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/auth/**").permitAll() // Public endpoints
                .anyRequest().authenticated() // Secure all other requests
            )
            // Add our custom JWT filter BEFORE the default UsernamePasswordAuthenticationFilter
            .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }
}

फ़िल्टर शृंखला चुनौती

हमने जिस JwtAuthenticationFilter पर चर्चा की है, उसके बारे में विचार कीजिए। JWT-आधारित प्रमाणीकरण संभालते समय Spring Security की फ़िल्टर शृंखला में इसकी मुख्य ज़िम्मेदारियाँ क्या हैं?

पाठ का पुनरावलोकन: कस्टम JWT फ़िल्टर

इस पाठ में हमने Spring Security में JWT प्रमाणीकरण संभालने के लिए कस्टम OncePerRequestFilter बनाना सीखा।

  • हमने Authorization शीर्षलेख से JWT निकालना सीखा।
  • हमने टोकन का सत्यापन करने और उपयोगकर्ता विवरण लोड करने के वैचारिक चरणों को समझा।
  • हमने SecurityContextHolder सेट करके उपयोगकर्ता का प्रमाणीकरण करना देखा।
  • अंत में, हमने HttpSecurity.addFilterBefore() का उपयोग करके इस फ़िल्टर को Spring Security की फ़िल्टर शृंखला में एकीकृत करना सीखा।

आपके सुरक्षित Spring Boot अनुप्रयोगों में JWT को सहज रूप से एकीकृत करने के लिए यह कस्टम फ़िल्टर अत्यंत महत्वपूर्ण है।

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

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

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

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

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

क्या “कस्टम JWT फ़िल्टर लागू करना” पाठ निःशुल्क है?

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

“कस्टम JWT फ़िल्टर लागू करना” में मैं क्या सीखूँगा?

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

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

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

“कस्टम JWT फ़िल्टर लागू करना” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

  1. JWT प्रमाणीकरण प्रवाह डिज़ाइन करना
  2. कस्टम JWT फ़िल्टर लागू करना
  3. AuthenticationManager और प्रदाता एकीकरण
  4. प्रमाणीकरण त्रुटियों और प्रवेश बिंदुओं का प्रबंधन
← Spring Security 6 और JWT प्रमाणीकरण पर वापस जाएँ