स्प्रिंग सुरक्षा ढांचे द्वारा दी गई मजबूत सुविधाओं का लाभ उठाकर अपने स्प्रिंग एप्लिकेशन की सुरक्षा सुनिश्चित करें।

स्प्रिंग सिक्योरिटी फ्रेमवर्क प्रमाणीकरण और प्राधिकरण के माध्यम से आपके एप्लिकेशन को सुरक्षित करता है। अपनी डिफ़ॉल्ट स्थिति में, स्प्रिंग सिक्योरिटी यह सुनिश्चित करती है कि आपके एप्लिकेशन में प्रत्येक HTTP अनुरोध पथ (या पृष्ठ) को एकल वैश्विक उपयोगकर्ता के प्रमाणीकरण की आवश्यकता है।

यह ढाँचा अत्यंत लचीला भी है। यह आपको अपने एप्लिकेशन में प्रत्येक HTTP अनुरोध पथ के साथ-साथ विभिन्न उपयोगकर्ताओं के लिए अनुकूलित सुरक्षा नियम बनाने की अनुमति देता है। इसलिए, आप उन पृष्ठों पर सुरक्षा प्रतिबंध हटा सकते हैं जिन्हें उपयोगकर्ता प्राधिकरण की आवश्यकता नहीं है (जैसे कि होम पेज)। और विशिष्ट उपयोगकर्ता प्रकारों की भूमिकाएँ और अधिकार निर्धारित करें।

आपके एप्लिकेशन में स्प्रिंग सुरक्षा जोड़ना

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

instagram viewer

यदि आपने ग्रैडल प्रोजेक्ट विकल्पों में से एक का चयन किया है, तो निर्भरता फ़ाइल है बिल्ड.ग्रेडल. हालाँकि, यदि आपने मावेन को चुना है, तो वह फ़ाइल है पोम.xml.

आपका बिल्ड.ग्रेडल फ़ाइल में निम्नलिखित निर्भरता होनी चाहिए:

dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}

जबकि आपका पीom.xml फ़ाइल में निम्नलिखित निर्भरता होनी चाहिए:


org.springframework.boot
spring-boot-starter-security

लेख में प्रयुक्त नमूना एप्लिकेशन इसमें उपलब्ध है गिटहब रिपॉजिटरी और यह आपके लिए एमआईटी लाइसेंस के तहत उपयोग करने के लिए निःशुल्क है।

स्प्रिंग सुरक्षा का उपयोग करना

एक बार जब आप अपने एप्लिकेशन में स्प्रिंग सिक्योरिटी निर्भरता जोड़ लेते हैं, तो आप तुरंत फ्रेमवर्क का उपयोग शुरू कर सकते हैं। बस अपने एप्लिकेशन को निष्पादित करें और फिर स्प्रिंग बूट के होम पेज (या अपने एप्लिकेशन के किसी भी पेज) पर नेविगेट करें। नमूना एप्लिकेशन स्प्रिंग बूट के डिफ़ॉल्ट को नियंत्रित करने के लिए निम्नलिखित प्रारंभिक नियंत्रक का उपयोग करता है लोकलहोस्ट: 8080 अनुरोध:

package com.springSecurityDemo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
publicclassWebController{

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

उपरोक्त एकल नियंत्रक वर्ग को जोड़ने के बाद आपके एप्लिकेशन को निष्पादित करने से निम्नलिखित प्रारंभिक दृश्य उत्पन्न होता है:

आप देखेंगे कि यह स्वचालित रूप से आपको निर्देशित करता है लोकलहोस्ट: 8080/लॉगिन पृष्ठ, और यह आपको एप्लिकेशन के किसी अन्य पृष्ठ तक पहुंचने की अनुमति देने से पहले ऐसा करता है। इस स्तर पर, आपको डिफ़ॉल्ट उपयोगकर्ता नाम (जो उपयोगकर्ता है) और स्वचालित रूप से जेनरेट किया गया पासवर्ड (जो आपको कंसोल में मिलेगा) प्रदान करना होगा। कंसोल निम्नलिखित की तरह एक लाइन उत्पन्न करेगा:

Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81

हर बार जब आप अपना एप्लिकेशन पुनः आरंभ करेंगे तो स्वचालित रूप से जेनरेट किया गया पासवर्ड बदल जाएगा, लेकिन उपयोगकर्ता नाम वही रहेगा। डिफ़ॉल्ट उपयोगकर्ता नाम और पासवर्ड दर्ज करने से आप अपने एप्लिकेशन में उचित दृश्य पर पहुंच जाएंगे।

स्प्रिंग सुरक्षा को अनुकूलित करना

अपनी एप्लिकेशन सुरक्षा को अनुकूलित करने के लिए, आपको स्प्रिंग सिक्योरिटी के डिफ़ॉल्ट कॉन्फ़िगरेशन को ओवरराइड करना होगा। लेकिन उससे पहले (मान लें कि आपके पास पहले से ही स्प्रिंग वेब है) आपको इस नमूना एप्लिकेशन के लिए कई अन्य निर्भरताओं की आवश्यकता होगी:

  • स्प्रिंग डेटा जेपीए
  • MySQL JDBC ड्राइवर
  • थाइमेलिफ़
  • लंबोक

थाइमेलीफ ढांचा अलग-अलग विचार उत्पन्न करेगा। लोम्बोक आपके ऑब्जेक्ट क्लास में कोड को कम करने में मदद करेगा। JPA लाइब्रेरी और MySQL ड्राइवर आपको एप्लिकेशन के साथ MySQL डेटाबेस का उपयोग करने की अनुमति देंगे, लेकिन आपके पास किसी भी डेटाबेस का उपयोग करने का विकल्प है जिसके साथ आप सहज हैं। डेटाबेस का उपयोग करने का अर्थ है कॉन्फ़िगर करना अनुप्रयोग.गुण संसाधन फ़ाइल के अंतर्गत फ़ाइल।

spring.datasource.url=jdbc: mysql://${MYSQL_HOST: localhost}:3306/spring_security
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update

उपरोक्त कॉन्फ़िगरेशन कोड आपको स्थानीय MySQL डेटाबेस से कनेक्ट करने की अनुमति देता है स्प्रिंग_सुरक्षा, के उपयोगकर्ता नाम के साथ जड़, और पासवर्ड (1234). आपको अपने डेटाबेस नाम और क्रेडेंशियल्स से मेल खाने के लिए इस डेटा को अपडेट करना होगा।

अपनी अतिरिक्त निर्भरताएँ जोड़ने और अपना डेटाबेस बनाने के बाद, आप यह तय करना शुरू कर सकते हैं कि आपके एप्लिकेशन पर कितने व्यूज होंगे। आपको यह भी जानना होगा कि प्रत्येक पृष्ठ की सुरक्षा कैसी दिखती है। हमारे नमूना आवेदन में 6 दृश्य हैं:

  • होम पेज
  • पंजीकरण पृष्ठ
  • लोग इन वाला पन्ना
  • लॉगआउट पेज
  • उपयोगकर्ता पृष्ठ
  • त्रुटि पृष्ठ

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

पंजीकरण नियंत्रक वर्ग

नियंत्रक पैकेज में वे कक्षाएं होंगी जो HTTP अनुरोधों को संभालती हैं। किसी पृष्ठ के कार्य के आधार पर आप आमतौर पर प्रत्येक HTTP अनुरोध को एक नियंत्रक वर्ग में समूहित कर सकते हैं, जैसा कि मामले में है वेबनियंत्रक कक्षा। हालाँकि, पंजीकरण दृश्य में अधिक विशिष्ट कार्य हैं, इस प्रकार, इसमें एक निजी नियंत्रक वर्ग हो सकता है:

@Controller
@RequestMapping("/register")
publicclassRegistrationController{
private UserRepository userRepo;
private PasswordEncoder passwordEncoder;

publicRegistrationController( UserRepository userRepo, PasswordEncoder passwordEncoder){
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
@GetMapping
public String registerForm(){
return"registration";
}
@PostMapping
public String processRegistration(RegistrationForm form){
userRepo.save(form.toUser(passwordEncoder));
return"redirect:/login";
}
}

पंजीकरण नियंत्रक क्लास आपके एप्लिकेशन के सुरक्षा पहलू का प्रवेश द्वार है। @RequestMapping एनोटेशन अनुरोध के प्रकार को निर्दिष्ट करता है जिसे यह नियंत्रक संभालेगा (अनुरोध)। लोकलहोस्ट: 8080/रजिस्टर).

@गेटमैपिंग एनोटेशन बस यह इंगित करता है कि यदि एप्लिकेशन को अनुरोध प्राप्त होता है /register, द पंजीकरण फॉर्म() विधि को पंजीकरण दृश्य लौटाकर उस अनुरोध को संभालना चाहिए।

जब कोई आगंतुक रजिस्टर बटन पर क्लिक करता है, तो @पोस्टमैपिंग एनोटेशन चलन में आता है। प्रक्रियापंजीकरण() विधि आपको उपयोगकर्ता डेटा पोस्ट करने की अनुमति देती है जो इसे प्राप्त होता है पंजीकरण फॉर्म का उपयोग करके डेटाबेस में क्लास लगाएं उपयोक्ता भंडार कक्षा। लेकिन इससे पहले कि यह इस डेटा को संग्रहीत करे प्रक्रियापंजीकरण() विधि का उपयोग करके उपयोगकर्ता के पासवर्ड को एन्क्रिप्ट किया जाता है वसंत कापासवर्ड एनकोडर इंटरफेस।

नए सुरक्षा कॉन्फ़िगरेशन बनाना

स्प्रिंग 3.1 के बाद से, डेवलपर्स अब जावा का उपयोग करके स्प्रिंग सिक्योरिटी के लिए कॉन्फ़िगरेशन बना सकते हैं, जिसका अर्थ है XML के बजाय कक्षाएं। इन कॉन्फ़िगरेशन वर्गों के लिए आवश्यक मुख्य चीज़ है @विन्यास टिप्पणी.

@Configuration
publicclassSecurityConfiguration{
}

@विन्यास एनोटेशन इंगित करता है कि उपरोक्त वर्ग एक कॉन्फ़िगरेशन वर्ग है। ये वर्ग बीन्स प्रदान करते हैं स्प्रिंग एप्लिकेशन संदर्भ, जो एक कंटेनर है जिसका उपयोग स्प्रिंग किसी एप्लिकेशन के विभिन्न घटकों (या बीन्स) को बनाने और प्रबंधित करने के लिए करता है। में पहली बीन सुरक्षा विन्यास वर्ग है पासवर्ड एनकोडर सेम।

@Bean
public PasswordEncoder passwordEncoder(){
 returnnew BCryptPasswordEncoder();
}

पंजीकरण नियंत्रक वर्ग का उपयोग करता है पासवर्ड एनकोडर डेटाबेस में सहेजने से पहले नए पासवर्ड को एनकोड करने के लिए बीन का उपयोग करें। एक और महत्वपूर्ण बीन जिसे आपको इसमें जोड़ना होगा सुरक्षा विन्यास वर्ग है उपयोगकर्ता विवरण सेवा सेम।

@Bean
public UserDetailsService userDetailsService(UserRepository userRepo){
 return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
thrownew UsernameNotFoundException("Customer '" + username + "' not found");
 };
}

उपयोगकर्ता विवरण सेवा बीन कार्यरत है स्प्रिंग सुरक्षाउपयोगकर्ता विवरण सेवा ग्राहक के लॉगिन सत्र के दौरान प्रमाणीकरण के लिए उपयोगकर्ता का उपयोगकर्ता नाम और पासवर्ड पुनः प्राप्त करने के लिए इंटरफ़ेस। इसलिए, जैसे ही कोई ग्राहक लॉगिन दृश्य में लॉगिन बटन पर क्लिक करता है उपयोगकर्ता विवरण सेवा बीन गति में आ जाती है।

के माध्यम से उपयोक्ता भंडार, द उपयोगकर्ता विवरण सेवा बीन डेटाबेस में सभी मौजूदा ग्राहकों तक पहुंच प्राप्त करता है। यह इंटरफ़ेस तब उपयोग करता है उपयोक्ता भंडार मेल खाने वाले उपयोगकर्ता नाम और पासवर्ड वाले उपयोगकर्ता का पता लगाने के लिए, फिर इस ग्राहक की सभी विशेषताओं को एक ऑब्जेक्ट के रूप में लौटाता है।

यदि लौटाई गई वस्तु ग्राहक है, तो यह ग्राहक एप्लिकेशन तक पहुंच प्राप्त करता है। अन्यथा, पृष्ठ स्वचालित रूप से ताज़ा हो जाएगा जिससे उपयोगकर्ता वैध क्रेडेंशियल दर्ज कर सकेगा।

फ़िल्टर श्रृंखला

स्प्रिंग सुरक्षासुरक्षाफ़िल्टरश्रृंखला इंटरफ़ेस उपयोगी है एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस (एपीआई) जो स्प्रिंग सुरक्षा कॉन्फ़िगरेशन में एक आवश्यक भूमिका निभाता है। यह इंटरफ़ेस के साथ काम करता है स्प्रिंग सुरक्षाHttp सुरक्षा विशिष्ट HTTP अनुरोधों के लिए फ़िल्टर श्रृंखला बनाने के लिए क्लास।

@Bean
public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/user").hasAuthority("USER").anyRequest().permitAll())
.formLogin(formLogin -> formLogin
.loginPage("/login").defaultSuccessUrl("/user", true))
.logout(logout -> logout.logoutSuccessUrl("/logout"));
 return http.build();
}

फ़िल्टरश्रृंखला उपरोक्त बीन का उपयोग करता है सुरक्षाफ़िल्टरश्रृंखला कई कार्यों को पूरा करने के लिए एपीआई। सबसे पहले, यह का उपयोग करता है Http सुरक्षा क्लास को यह निर्देशित करने के लिए कि केवल उपयोगकर्ता की भूमिका वाले उपयोगकर्ता ही एक्सेस कर सकते हैं लोकलहोस्ट: 8080/उपयोगकर्ता. और पंजीकरण के बाद एक उपयोगकर्ता को यह भूमिका मिलती है, धन्यवाद प्राधिकरण प्राप्त करें() वह विधि जिसे प्रत्येक नया ग्राहक ऑब्जेक्ट लागू करता है।

@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
 return Arrays.asList(new SimpleGrantedAuthority("USER"));
}

फ़िल्टर श्रृंखला एप्लिकेशन में अन्य सभी URL तक अप्रमाणित पहुंच की अनुमति देती है। फ़िल्टरश्रृंखला बीन का भी उपयोग करता है फॉर्मलॉगिन() और लॉग आउट() के तरीके Http सुरक्षा क्लास ऑब्जेक्ट.

ये विधियाँ आपको किसी उपयोगकर्ता को कोई कार्य करने के बाद स्वचालित रूप से विशिष्ट पृष्ठों पर निर्देशित करने की अनुमति देती हैं। तो, एक उपयोगकर्ता जो सही क्रेडेंशियल दर्ज करता है और लॉगिन बटन पर क्लिक करता है /login पृष्ठ स्वचालित रूप से निर्देशित किया जाएगा /user पृष्ठ।

अंततः फ़िल्टरश्रृंखला बीन फ़िल्टर श्रृंखला बनाता है और लौटाता है, जो अधिकृत उपयोगकर्ताओं को एप्लिकेशन तक पहुंचने की अनुमति देता है। सभी तीन फलियाँ सुरक्षा विन्यास आपके आवेदन को सुरक्षित करने के लिए कक्षा मिलकर काम करती है।

हालांकि फ़िल्टरश्रृंखला बीन प्राधिकरण स्तर को निर्धारित करने में अधिक महत्वपूर्ण भूमिका निभाता है प्रत्येक HTTP अनुरोध. जैसे ही आप अपने एप्लिकेशन में अधिक पेज जोड़ना शुरू करते हैं, आप इसका उपयोग कर सकते हैं फ़िल्टरश्रृंखला बीन उनके सुरक्षा स्तर को निर्धारित करने के लिए।

स्प्रिंग सुरक्षा का प्रमुख लाभ

स्प्रिंग सिक्योरिटी आपको न केवल इस बात पर पूर्ण नियंत्रण देती है कि आपके एप्लिकेशन तक किसकी पहुंच है, बल्कि उपयोगकर्ता के पास किस प्रकार की पहुंच हो सकती है (इसकी उपयोगकर्ता भूमिका सुविधा के माध्यम से)। अभिगम नियंत्रण किसी भी एप्लिकेशन का सबसे महत्वपूर्ण पहलुओं में से एक है। सीमित पहुंच नियंत्रण बाधाओं के कारण सामान्य उपयोगकर्ताओं को आपके एप्लिकेशन तक अनफ़िल्टर्ड एक्सेस देना एक महंगी गलती साबित हो सकती है।