Looking for spring-security Answers? Try Ask4KnowledgeBase
Looking for spring-security Keywords? Try Ask4Keywords

spring-securityवसंत-सुरक्षा के साथ शुरुआत करना


टिप्पणियों

यह खंड वसंत-सुरक्षा क्या है, और एक डेवलपर इसका उपयोग क्यों करना चाहता है, इसका अवलोकन प्रदान करता है।

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

संस्करण

संस्करण रिलीज़ की तारीख
4.2.2 2017/03/02
3.2.10 2016/12/22
4.2.1 2016/12/21
4.1.4 2016/12/21
4.2.0 2016/11/10

हैलो स्प्रिंग सिक्योरिटी

नोट 1: आपको इस उदाहरण को शुरू करने से पहले जावा सर्वलेट पेज (JSP) और अपाचे मावेन के बारे में कुछ पूर्व ज्ञान की आवश्यकता है।

वेब सर्वर ( Apache tomcat की तरह) को मौजूदा वेब प्रोजेक्ट के साथ शुरू करें या एक बनाएँ।

Index.jsp पर जाएँ।

कोई भी उस पृष्ठ तक पहुंच सकता है, यह असुरक्षित है!


सुरक्षित आवेदन

  1. अद्यतन मावेन निर्भरता

अपनी pom.xml फ़ाइल में निर्भरता जोड़ना

pom.xml

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-web</artifactId>
  <version>4.0.1.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-config</artifactId>
  <version>4.0.1.RELEASE</version>
</dependency>
 

नोट 1: यदि आप पहले अपनी परियोजना में "स्प्रिंग" का उपयोग नहीं कर रहे हैं, तो "स्प्रिंग-संदर्भ" के बारे में कोई निर्भरता नहीं है। यह उदाहरण "स्प्रिंग-संदर्भ" के साथ xml कॉन्फ़िगरेशन का उपयोग करेगा। इसलिए इस निर्भरता को भी जोड़ें।

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.2.2.RELEASE</version>
</dependency>
 

नोट 2: यदि आप पहले अपनी परियोजना में JSTL का उपयोग नहीं कर रहे हैं, तो इसके बारे में कोई निर्भरता नहीं है। यह उदाहरण जेएसटीएल का उपयोग जेएसपी पेज में करेगा। इसलिए इस निर्भरता को भी जोड़ें।

<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>javax.servlet.jsp.jstl</artifactId>
  <version>1.2.1</version>
</dependency>
 

  1. स्प्रिंग सुरक्षा कॉन्फ़िगरेशन फ़ाइल बनाएँ

"WEB-INF" फ़ोल्डर के अंदर फ़ोल्डर का नाम "स्प्रिंग" बनाएं और security.xml फ़ाइल बनाएं। अगले कोड से कॉपी और पेस्ट करें।

वेब-INF / वसंत / security.xml

<b:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:b="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                             http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

  <http />

  <user-service>
    <user name="stackoverflow" password="pwd" authorities="ROLE_USER" />
  </user-service>

</b:beans>
 

  1. अद्यतन web.xml

"WEB-INF" फ़ोल्डर के अंदर अपने web.xml को अपडेट करें

वेब-INF / web.xml

<filter>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
 

नोट: यदि आप पहले अपनी परियोजना में "स्प्रिंग" का उपयोग नहीं कर रहे हैं, तो स्प्रिंग संदर्भों के लोड के बारे में कोई कॉन्फ़िगरेशन नहीं है। इसलिए इस पैरामीटर और श्रोता को भी जोड़ें।

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
    /WEB-INF/spring/*.xml
  </param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 

सुरक्षित वेब एप्लिकेशन चलाना

अपना वेब सर्वर चलाने और index.jsp पर जाने के बाद, आपको डिफ़ॉल्ट लॉगिन पेज दिखाई देगा जो कि वसंत सुरक्षा द्वारा उत्पन्न होता है। क्योंकि आप प्रमाणित नहीं हैं।

लॉगिन पेज जो वसंत सुरक्षा द्वारा उत्पन्न होता है

आप लॉगिन कर सकते हैं

username : stackoverflow
password : pwd
 

नोट: WEB-INF / spring / security.xml पर उपयोगकर्ता नाम और पासवर्ड सेटिंग


उपयोगकर्ता नाम प्रदर्शित करना

"हैलो" के बाद jstl टैग जोड़ना, जो उपयोगकर्ता नाम प्रिंट करता है

index.jsp

<h1>Hello <c:out value="${pageContext.request.remoteUser}" />!!</h1>
 

उपयोगकर्ता नाम प्रदर्शित करना


लॉग आउट कर रहा हूं

index.jsp

"हैलो उपयोगकर्ता नाम" के बाद फ़ॉर्म, इनपुट टैग जोड़ना, जो वसंत सुरक्षा से यूआरएल / लॉगआउट उत्पन्न लॉगिंग प्रस्तुत करता है।

<h1>Hello <c:out value="${pageContext.request.remoteUser}" />!!</h1>

<form action="/logout" method="post">
  <input type="submit" value="Log out" />
  <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
 

जब आप सफलतापूर्वक लॉग आउट करते हैं, तो आप फिर से ऑटो जेनरेट किए गए लॉगिन पृष्ठ को देखते हैं। आपकी वजह से अब प्रमाणित नहीं किया जाता है।

लॉग आउट बटन, लॉगआउट सफलता

स्थापना या सेटअप

वसंत-सुरक्षा स्थापित करने या स्थापित करने पर विस्तृत निर्देश।

REST API एंडपॉइंट की सुरक्षा के लिए स्प्रिंग सिक्यूरिटी

pom.xml में प्रविष्टियों को नीचे जोड़ें।

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>3.1.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>3.1.0.RELEASE</version>
</dependency>
 

स्प्रिंग संस्करण 3.1 से अधिक के लिए महत्वपूर्ण:

org.springframework.security.filterChains लिए बीन निर्माण त्रुटि तब आती है जब आप स्प्रिंग संस्करण 3.1 से अधिक का उपयोग कर रहे होते हैं और अपने pom.xml में spring-aop , spring-jdbc , spring-tx और spring-expressions लिए मैन्युअल रूप से निर्भरता नहीं जोड़ी होती है।

स्प्रिंग संदर्भ में प्रविष्टियों को नीचे जोड़ें। हम दो बाकी एंडपॉइंट (हेलोवर्ल्ड और अलविदा) की रक्षा करना चाहते हैं। स्प्रिंग संस्करण के अनुसार XSD संस्करण समायोजित करें।

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:security="http://www.springframework.org/schema/security"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
                       http://www.springframework.org/schema/security
                       http://www.springframework.org/schema/security/spring-security-3.1.xsd">
                               
    <security:http auto-config='true' create-session="never">
        <security:intercept-url pattern="/helloworld/**" access="ROLE_USER" />
        <security:intercept-url pattern="/goodbye/**" access="ROLE_ADMIN" />
        <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:http-basic />
    </security:http>

    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="username1" password="password1"
                    authorities="ROLE_USER" />
                <security:user name="username2" password="password2"
                    authorities="ROLE_ADMIN" />
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>
</beans>
 

web.xml में प्रविष्टियों को नीचे जोड़ें।

<!-- Spring security-->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:security-context.xml</param-value>
</context-param>
 

स्प्रिंग-बूट और JDBC प्रमाणीकरण का उपयोग करके स्प्रिंग-सुरक्षा

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
 

यहां एक सुरक्षा कॉन्फ़िगरेशन है जो सुनिश्चित करता है कि केवल प्रमाणित उपयोगकर्ता ही पहुंच सकते हैं।

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
DataSource datasource;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest()
            .fullyAuthenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login?logout")
            .permitAll()
            .and()
        .csrf();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication().dataSource(datasource).passwordEncoder(passwordEncoder());
}

@Bean
public PasswordEncoder passwordEncoder() {
    PasswordEncoder encoder = new BCryptPasswordEncoder();
    return encoder;
}
}
 
विन्यास विवरण
@Configuration इंगित करता है कि वर्ग का उपयोग स्प्रिंग IoC कंटेनर द्वारा सेम परिभाषाओं के स्रोत के रूप में किया जा सकता है।
@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER) किसी अन्य ऑटोकॉन्फ़िगर्ड सुविधाओं को बदले बिना एक्सेस नियमों को ओवरराइड करें। निचले मूल्यों में उच्च प्राथमिकता है।
WebSecurityConfigurerAdapter SecurityConfig वर्ग सुरक्षा कॉन्फ़िगरेशन की कुछ बारीकियों को सेट करने के लिए अपने तरीकों के एक जोड़े का विस्तार करता है और ओवरराइड करता है।
@Autowired की DataSource भौतिक डेटा स्रोत से कनेक्शन के लिए फ़ैक्टरी प्रदान करें।
configure(HttpSecurity) ओवरराइड विधि परिभाषित करती है कि कौन से URL पथ सुरक्षित होने चाहिए और कौन से नहीं होने चाहिए।
.authorizeRequests().anyRequest() .fullyAuthenticated() वसंत को इंगित करता है कि हमारे आवेदन के लिए सभी अनुरोधों को प्रमाणित करने की आवश्यकता है।
.formLogin() फ़ॉर्म आधारित लॉगिन कॉन्फ़िगर करता है
.loginPage("/login").failureUrl("/login?error").permitAll() पृष्ठ में लॉग का स्थान निर्दिष्ट करता है और सभी उपयोगकर्ताओं को पृष्ठ तक पहुंचने की अनुमति दी जानी चाहिए।
.logout().logoutUrl("/logout") .logoutSuccessUrl("/login?logout").permitAll() लॉगआउट होने के बाद रीडायरेक्ट करने वाला URL। डिफ़ॉल्ट / लॉगिन है? लॉगआउट।
.csrf() क्रॉस साइट अनुरोध को रोकने के लिए उपयोग किया जाता है, CSRF सुरक्षा सक्षम है (डिफ़ॉल्ट)।
configure(AuthenticationManagerBuilder){} उपयोगकर्ताओं को कैसे प्रमाणित किया जाता है यह परिभाषित करने के लिए ओवरराइड विधि।
.jdbcAuthentication().dataSource(datasource) वसंत को इंगित करता है कि हम JDBC प्रमाणीकरण का उपयोग कर रहे हैं
.passwordEncoder(passwordEncoder()) वसंत को इंगित करता है कि हम अपने पासवर्ड को एनकोड करने के लिए एक पासवर्ड एनकोडर का उपयोग कर रहे हैं। (पासवर्ड एनकोडर की पसंद को वापस करने के लिए एक बीन बनाई गई है, हम इस मामले में BCrypt का उपयोग कर रहे हैं)

ध्यान दें कि हमने किसी तालिका नाम का उपयोग या किसी क्वेरी के लिए कॉन्फ़िगर नहीं किया है, इसका कारण यह है कि डिफ़ॉल्ट रूप से वसंत सुरक्षा नीचे दी गई तालिकाओं के लिए दिखती है:

create table users (   
  username varchar(50) not null primary key,
  password varchar(255) not null,
  enabled boolean not null) ;

create table authorities (
  username varchar(50) not null,
  authority varchar(50) not null,
  foreign key (username) references users (username),
  unique index authorities_idx_1 (username, authority));
 

उपरोक्त पंक्तियों में निम्नलिखित पंक्तियाँ डालें:

INSERT INTO authorities(username,authority) 
VALUES ('user', 'ROLE_ADMIN');

INSERT INTO users(username,password,enabled)
VALUES('user', '$2a$10$JvqOtJaDys0yoXPX9w47YOqu9wZr/PkN1dJqjG9HHAzMyu9EV1R4m', '1');
 

हमारे मामले में user नाम user और पासवर्ड भी BCrypt एल्गोरिथ्म के साथ एन्क्रिप्ट किया गया user है

अंत में, का उपयोग करने के लिए वसंत बूट के लिए application.properties में एक डेटा स्रोत कॉन्फ़िगर करें:

spring.datasource.url = jdbc:mysql://localhost:3306/spring
spring.datasource.username = root
spring.datasource.password = Welcome123
 

नोट: लॉगिन कंट्रोलर बनाएं और कॉन्फ़िगर करें और इसे पथ /login मैप करें और इस कंट्रोलर को अपना लॉगिन पेज इंगित करें