Spring Boot 4 की संपूर्ण मार्गदर्शिका · पाठ

SpEL और कस्टम मतदाताओं के साथ विधि सुरक्षा

@PreAuthorize, SpEL expressions और कस्टम प्राधिकरण तर्क का उपयोग करके सूक्ष्म स्तर की पहुँच लागू कीजिए।

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

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

मेथड सुरक्षा क्यों?

URL-आधारित सुरक्षा (HttpSecurity मैचर) प्रवेश बिंदुओं की सुरक्षा करती है, लेकिन वह किसी मेथड को मिलने वाले आर्ग्युमेंट या उसके द्वारा लौटाई जाने वाली ऑब्जेक्ट को नहीं देख सकती। मेथड सुरक्षा इस कमी को दूर करते हुए सेवा स्तर पर ही नियम लागू करती है।

  • सुरक्षा की कई परतें — कंट्रोलर जाँच करना भूल जाए, तब भी सुरक्षा बनी रहती है।
  • सूक्ष्म नियंत्रण — पैरामीटर, रिटर्न मान और प्रमाणित प्रिंसिपल के आधार पर निर्णय लीजिए।
  • पुनः उपयोग योग्य — वही सुरक्षित सेवा REST, GraphQL या संदेश श्रोता से कॉल की जा सकती है और सुरक्षित रहती है।

इस पाठ में हम @PreAuthorize, SpEL expressions और कस्टम प्राधिकरण प्रबंधक से पहुँच लागू करेंगे।

मेथड सुरक्षा सक्षम करना

Spring Boot 4 / Spring Security 6 में मेथड सुरक्षा वैकल्पिक रूप से सक्षम की जाती है। किसी कॉन्फ़िगरेशन क्लास में @EnableMethodSecurity जोड़िए। यह AOP प्रॉक्सी के माध्यम से annotations सक्रिय करता है।

  • prePostEnabled का डिफ़ॉल्ट मान true है — @PreAuthorize और @PostAuthorize तुरंत काम करते हैं।
  • पुराने @Secured के लिए securedEnabled = true, या @RolesAllowed के लिए jsr250Enabled = true सेट कीजिए।

ध्यान दें: पुराना @EnableGlobalMethodSecurity हटा दिया गया है — हमेशा @EnableMethodSecurity का उपयोग कीजिए।

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;

@Configuration
@EnableMethodSecurity
public class MethodSecurityConfig {
    // prePostEnabled = true by default
    // @PreAuthorize / @PostAuthorize now active
}

भूमिकाओं और प्राधिकरणों के साथ @PreAuthorize

@PreAuthorize किसी मेथड के चलने से पहले SpEL एक्सप्रेशन का मूल्यांकन करता है। यदि इसका परिणाम false होता है, तो Spring AccessDeniedException उत्पन्न करता है और बॉडी कभी निष्पादित नहीं होती।

  • hasRole('ADMIN') — ROLE_ADMIN प्राधिकरण की जाँच करता है (उपसर्ग आपके लिए जोड़ दिया जाता है)।
  • hasAuthority('SCOPE_orders:write') — प्राधिकरण का सटीक मिलान करता है, कोई उपसर्ग नहीं जोड़ा जाता।
  • hasAnyRole('ADMIN','MANAGER') और बूलियन ऑपरेटर and / or / !।
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;

@Service
public class AccountService {

    @PreAuthorize("hasRole('ADMIN')")
    public void closeAccount(Long accountId) {
        // only ROLE_ADMIN reaches here
    }

    @PreAuthorize("hasAnyRole('ADMIN','SUPPORT') or hasAuthority('SCOPE_accounts:write')")
    public void freezeAccount(Long accountId) {
        // ...
    }
}

# से मेथड के आर्ग्युमेंट का संदर्भ लेना

SpEL की वास्तविक शक्ति मेथड के आर्ग्युमेंट पढ़ने में है। किसी पैरामीटर नाम के आगे # लगाकर उसे एक्सप्रेशन के भीतर उपयोग करें। इससे आप principal की पहचान की तुलना उस डेटा से कर सकते हैं जिस पर कार्रवाई की जा रही है।

  • authentication — वर्तमान Authentication ऑब्जेक्ट।
  • principal — principal (अक्सर UserDetails या JWT)।
  • #username, #order.ownerId — मेथड आर्ग्युमेंट और उनके गुण।

आर्ग्युमेंट नामों के लिए ऐसे पैरामीटर आवश्यक हैं जिन्हें -parameters के साथ कंपाइल किया गया हो (Spring Boot इसे डिफ़ॉल्ट रूप से सक्षम करता है)।

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;

@Service
public class ProfileService {

    // A user may edit only their own profile, unless they are an admin
    @PreAuthorize("#username == authentication.name or hasRole('ADMIN')")
    public void updateProfile(String username, ProfileDto dto) {
        // ...
    }
}

@PostAuthorize और returnObject

@PostAuthorize मेथड के परिणाम लौटाने के बाद चलता है और returnObject के माध्यम से परिणाम की जाँच कर सकता है। इसका उपयोग तब करें जब यह जानने के लिए पहले entity लोड करना आवश्यक हो कि उसका स्वामी कौन है।

  • यह इस नियम के लिए उपयोगी है: “आप इस रिकॉर्ड को तभी पढ़ सकते हैं जब यह आपका हो।”
  • मेथड बॉडी निष्पादित होती है, इसलिए ऐसे साइड इफ़ेक्ट वाले ऑपरेशन के लिए इसका उपयोग न करें जिन्हें आपको रोकना आवश्यक है।
  • अस्वीकृति की स्थिति में लौटाया गया मान हटा दिया जाता है और AccessDeniedException उत्पन्न होता है।
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.stereotype.Service;

@Service
public class DocumentService {

    @PostAuthorize("returnObject.ownerUsername == authentication.name or hasRole('ADMIN')")
    public Document findById(Long id) {
        return repository.findById(id).orElseThrow();
    }
}

कलेक्शन पर @PreFilter और @PostFilter

फ़िल्टरिंग एनोटेशन अपवाद उत्पन्न करने के बजाय कलेक्शन के तत्वों को एक-एक करके हटाते हैं। इनमें प्रत्येक तत्व से बंधा हुआ विशेष चर filterObject उपयोग किया जाता है।

  • @PreFilter — मेथड चलने से पहले कलेक्शन आर्ग्युमेंट से अनधिकृत तत्व हटा देता है।
  • @PostFilter — लौटाए गए कलेक्शन से अनधिकृत तत्व हटा देता है।
  • जब किसी मेथड में एक से अधिक कलेक्शन पैरामीटर हों, तब filterTarget का उपयोग करें।

सावधान: मेमोरी में बड़े परिणाम-समुच्चयों को फ़िल्टर करना महँगा हो सकता है — जहाँ संभव हो, क्वेरी में ही फ़िल्टर करना बेहतर है।

import org.springframework.security.access.prepost.PostFilter;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class OrderService {

    // Caller sees only the orders they own (admins see all)
    @PostFilter("filterObject.ownerUsername == authentication.name or hasRole('ADMIN')")
    public List<Order> findRecentOrders() {
        return repository.findRecent();
    }
}

@ का उपयोग करके SpEL से Bean को कॉल करना

जब लॉजिक जटिल हो जाए, तो उसे Spring bean में रखें और @beanName.method(...) का उपयोग करके एक्सप्रेशन से कॉल करें। इससे एनोटेशन पढ़ने योग्य रहते हैं और नियम का यूनिट टेस्ट किया जा सकता है।

  • @ एप्लिकेशन संदर्भ से bean का समाधान करता है।
  • authentication और मेथड आर्ग्युमेंट सीधे bean मेथड में पास करें।
  • मेथड को boolean लौटाना आवश्यक है।
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

@Component("projectAccess")
public class ProjectAccessEvaluator {

    public boolean canEdit(Authentication auth, Long projectId) {
        String user = auth.getName();
        return membershipRepository.isEditor(user, projectId);
    }
}

// Usage on a service method:
// @PreAuthorize("@projectAccess.canEdit(authentication, #projectId)")
// public void rename(Long projectId, String name) { ... }

PermissionEvaluator और hasPermission

SpEL hasPermission(target, permission) उपलब्ध कराता है, जो PermissionEvaluator bean को सौंप देता है। यह प्रत्येक एनोटेशन में लॉजिक लिखे बिना डोमेन-ऑब्जेक्ट (ACL-शैली) प्राधिकरण के लिए मानक हुक है।

  • hasPermission(#doc, 'WRITE') — ऑब्जेक्ट और अनुमति कुंजी पास करता है।
  • hasPermission(#id, 'com.app.Document', 'READ') — आईडी और प्रकार पास करता है।
  • आप MethodSecurityExpressionHandler के माध्यम से ठीक एक PermissionEvaluator पंजीकृत करते हैं।
import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.core.Authentication;
import java.io.Serializable;

public class DocumentPermissionEvaluator implements PermissionEvaluator {

    @Override
    public boolean hasPermission(Authentication auth, Object target, Object permission) {
        if (target instanceof Document doc) {
            return "WRITE".equals(permission)
                ? doc.getOwnerUsername().equals(auth.getName())
                : true; // READ allowed for all in this example
        }
        return false;
    }

    @Override
    public boolean hasPermission(Authentication auth, Serializable id,
                                 String type, Object permission) {
        return false; // resolve by id+type if needed
    }
}

कस्टम Expression Handler पंजीकृत करना

अपने PermissionEvaluator को SpEL से जोड़ने के लिए, एक DefaultMethodSecurityExpressionHandler bean उपलब्ध कराएँ और उसमें evaluator सेट करें। Spring Security इसे सभी मेथड एनोटेशन के लिए उपयोग करता है।

  • Bean का नाम महत्वपूर्ण नहीं है; उसका प्रकार महत्वपूर्ण है।
  • आप यहाँ कस्टम RoleHierarchy भी जोड़ सकते हैं, ताकि hasRole विरासत का सम्मान करे।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;

@Configuration
@EnableMethodSecurity
public class ExpressionHandlerConfig {

    @Bean
    static DefaultMethodSecurityExpressionHandler expressionHandler() {
        var handler = new DefaultMethodSecurityExpressionHandler();
        handler.setPermissionEvaluator(new DocumentPermissionEvaluator());
        return handler;
    }
}

कस्टम AuthorizationManager (नया Voter)

Spring Security 6 ने पुराने AccessDecisionVoter की जगह अधिक सरल AuthorizationManager<T> रखा है। मेथड सुरक्षा के लिए प्रकार पैरामीटर MethodInvocation होता है। check को लागू करके AuthorizationDecision लौटाएँ।

  • new AuthorizationDecision(true|false) लौटाएँ — या निर्णय से अलग रहने और अन्य मैनेजरों को निर्णय लेने देने के लिए null लौटाएँ।
  • इसे @EnableMethodSecurity(prePostEnabled = false) और एक advisor के साथ पंजीकृत करें, या AuthorizationManagers.allOf(...) से मैनेजरों को संयोजित करें।
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.security.authorization.AuthorizationDecision;
import org.springframework.security.authorization.AuthorizationManager;
import org.springframework.security.core.Authentication;
import java.util.function.Supplier;

public class BusinessHoursAuthorizationManager
        implements AuthorizationManager<MethodInvocation> {

    @Override
    public AuthorizationDecision check(Supplier<Authentication> auth,
                                       MethodInvocation invocation) {
        int hour = java.time.LocalTime.now().getHour();
        boolean withinHours = hour >= 9 && hour < 18;
        return new AuthorizationDecision(withinHours);
    }
}

Pre बनाम Post: सही विकल्प चुनना

गलत एनोटेशन चुनने से या तो डेटा लीक हो सकता है या मान्य कॉल अवरुद्ध हो सकती हैं। त्वरित निर्णय मार्गदर्शिका:

  • नियम केवल आर्ग्युमेंट + principal पर निर्भर करता है → @PreAuthorize (तेज़, बिना साइड इफ़ेक्ट के)।
  • नियम लोड की गई entity के स्वामित्व पर निर्भर करता है → @PostAuthorize।
  • कलेक्शन को प्रत्येक तत्व के आधार पर छोटा करना हो → @PostFilter (या क्वेरी में फ़िल्टर करें)।
  • पुनः उपयोग योग्य डोमेन-ऑब्जेक्ट नियम हो → hasPermission + PermissionEvaluator।

याद रखें: @PostAuthorize और @PostFilter मेथड बॉडी चलाते हैं, इसलिए किसी परिवर्तनकारी ऑपरेशन को रोकने के लिए इन पर कभी निर्भर न रहें।

त्वरित जाँच

आपके पास Document findById(Long id) मेथड है जो एक डॉक्यूमेंट लोड करता है, और पहुँच केवल तभी दी जानी चाहिए जब लौटाए गए डॉक्यूमेंट का ownerUsername कॉल करने वाले के नाम के बराबर हो या कॉल करने वाला व्यवस्थापक हो। इसे सही ढंग से व्यक्त करने वाला एनोटेशन कौन-सा है?

पुनरावलोकन

अब आप मेथड स्तर पर सूक्ष्म पहुँच नियंत्रण लागू करते हैं:

  • @EnableMethodSecurity एनोटेशन-आधारित जाँच सक्षम करता है (अब @EnableGlobalMethodSecurity की आवश्यकता नहीं है)।
  • @PreAuthorize SpEL का उपयोग करके निष्पादन से पहले सुरक्षा करता है: hasRole, hasAuthority, #args और authentication।
  • @PostAuthorize returnObject की जाँच करता है; @PreFilter/@PostFilter filterObject के माध्यम से कलेक्शन के तत्व हटाते हैं।
  • जटिल नियमों को bean (@beanName.method(...)) में रखें या hasPermission के पीछे PermissionEvaluator का उपयोग करें।
  • सभी जगह लागू होने वाली नीति के लिए AuthorizationManager<MethodInvocation> लागू करें — यह voters का आधुनिक विकल्प है।

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

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

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

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

पाठ्यक्रम
21
पाठ
84

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

क्या “SpEL और कस्टम मतदाताओं के साथ विधि सुरक्षा” पाठ निःशुल्क है?

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

“SpEL और कस्टम मतदाताओं के साथ विधि सुरक्षा” में मैं क्या सीखूँगा?

@PreAuthorize, SpEL expressions और कस्टम प्राधिकरण तर्क का उपयोग करके सूक्ष्म स्तर की पहुँच लागू कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Spring Boot 4 की संपूर्ण मार्गदर्शिका का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Spring Boot 4 की संपूर्ण मार्गदर्शिका शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

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

“SpEL और कस्टम मतदाताओं के साथ विधि सुरक्षा” पाठ पूरा करने में कितना समय लगता है?

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

क्या मैं इस Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ में कोड लिख और चला सकता हूँ?

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

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

  1. रिसोर्स सर्वर JWT सत्यापन और दावे
  2. OAuth2 क्लाइंट और प्राधिकरण कोड प्रवाह
  3. SpEL और कस्टम मतदाताओं के साथ विधि सुरक्षा
  4. अपारदर्शी टोकन का निरीक्षण और टोकन विनिमय
← Spring Boot 4 की संपूर्ण मार्गदर्शिका पर वापस जाएँ