मैं सत्रों के बिना स्प्रिंग सुरक्षा का उपयोग कैसे कर सकता हूं?


99

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

अब तक, मेरे पास कुकी के माध्यम से एक टोकन असाइन करने के लिए रिमेम्बरमेसेर्स सेटअप है, और यह ठीक काम करता है, लेकिन मैं चाहता हूं कि कुकी ब्राउज़र सत्र के साथ समाप्त हो जाए (उदाहरण के लिए जब ब्राउज़र बंद हो जाता है)।

मुझे कल्पना करना है कि मैं सत्रों के बिना स्प्रिंग सिक्योरिटी का उपयोग करने वाला पहला व्यक्ति नहीं हूं ... कोई सुझाव?

जवाबों:


124

जावा कॉन्फिग के साथ स्प्रिंग सिक्योरिटी 3 में , आप HttpSecurity.sessionManagement () का उपयोग कर सकते हैं :

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}

2
यह जावा कॉन्फिगरेशन के लिए सही उत्तर है, स्वीकार किए गए उत्तर पर एक टिप्पणी में xml कॉन्फिगरेशन के लिए @sappenin ने जो सही ढंग से बताया है उसे मिरर करें। हम इस पद्धति का उपयोग करते हैं और वास्तव में हमारा आवेदन सत्र रहित है।
पॉल

इसका साइड इफेक्ट है। Tomcat कंटेनर "जोड़ देगा; jsessionid = ..." छवियों, स्टाइलशीट, आदि के लिए अनुरोध करने के लिए, क्योंकि Tomcat को स्टेटलेस होना पसंद नहीं है, और स्प्रिंग सिक्योरिटी इन संपत्तियों को पहले लोड पर ब्लॉक करेगी क्योंकि "URL में निहित है संभावित दुर्भावनापूर्ण स्ट्रिंग ';' '।
कार्यकर्ताजू

@workerjoe तो, आप इस जावा कॉन्फ़िगरेशन द्वारा क्या कहने की कोशिश कर रहे हैं, सत्र वसंत सुरक्षा के बजाय नहीं बनाया जाता है?
विश्वास अत्रे

@VishwasAtrey मेरी समझ में (जो गलत हो सकता है), टॉम्कट सत्र बनाता और बनाए रखता है। वसंत उनका फायदा उठाता है, अपना डेटा जोड़ता है। मैंने एक स्टेटलेस वेब एप्लिकेशन बनाने की कोशिश की और यह काम नहीं किया, जैसा कि मैंने ऊपर उल्लेख किया है। अधिक के लिए मेरे स्वयं के प्रश्न का यह उत्तर देखें ।
कार्यकर्ताजू

28

यह स्प्रिंग सिक्यूरिटी 3.0 में और भी आसान प्रतीत होता है। यदि आप नाम स्थान कॉन्फ़िगरेशन का उपयोग कर रहे हैं, तो आप बस निम्नानुसार कर सकते हैं:

<http create-session="never">
  <!-- config -->
</http>

या फिर आप अशक्त के रूप में SecurityContextRepository कॉन्फ़िगर कर सकता है, और कुछ भी नहीं कभी उस तरह से बचा लिया जायेगा और साथ ही


5
जैसा कि मैंने सोचा था कि यह काम नहीं करेगा। इसके बजाय, नीचे एक टिप्पणी है जो "कभी नहीं" और "स्टेटलेस" के बीच अंतर करती है। "कभी नहीं" का उपयोग करते हुए, मेरा ऐप अभी भी सत्र बना रहा था। "स्टेटलेस" का उपयोग करते हुए, मेरा ऐप वास्तव में स्टेटलेस हो गया, और मुझे अन्य उत्तरों में वर्णित किसी भी ओवरराइड को लागू करने की आवश्यकता नहीं थी। यहाँ JIRA मुद्दा देखें: jira.springsource.org/browse/SEC-1424
sappenin

27

हमने आज 4-5 घंटे के लिए एक ही मुद्दे पर (कस्टम सिक्योरिटीकोटेक्स्ट रिपॉजिटरी टू सिक्योरिटीकोटेक्स्टसर्फ़ेंसिल्टर) का काम किया। अंत में, हमने इसका पता लगाया। सबसे पहले, वसंत सुरक्षा रेफरी के खंड 8.3 में। doc, एक SecurityContextPersistenceFilter बीन परिभाषा है

<bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter">
    <property name='securityContextRepository'>
        <bean class='org.springframework.security.web.context.HttpSessionSecurityContextRepository'>
            <property name='allowSessionCreation' value='false' />
        </bean>
    </property>
</bean>

और इस परिभाषा के बाद, यह स्पष्टीकरण है: "वैकल्पिक रूप से आप SecurityContextRepository इंटरफ़ेस का एक अशक्त कार्यान्वयन प्रदान कर सकते हैं, जो सुरक्षा संदर्भ को संग्रहीत होने से रोक देगा, भले ही अनुरोध के दौरान एक सत्र पहले ही बनाया गया हो।"

हमें अपने कस्टम SecurityContextRepository को SecurityContextPersistenceFilter में इंजेक्ट करने की आवश्यकता थी। इसलिए हमने बस अपने कस्टम इम्प्लांट के साथ ऊपर बीन की परिभाषा को बदल दिया और इसे सुरक्षा संदर्भ में डाल दिया।

जब हम एप्लिकेशन चलाते हैं, तो हमने लॉग को ट्रेस किया और देखा कि SecurityContextPersistenceFilter हमारे कस्टम निहित का उपयोग नहीं कर रहा था, यह HttpSessionSecurityContextRepository का उपयोग कर रहा था।

कुछ अन्य चीजों के बाद हमने कोशिश की, हमें पता चला कि हमें अपने कस्टम SecurityContextRepository को "http" नाम स्थान के "सुरक्षा-संदर्भ-रिपॉजिटरी-रेफरी" विशेषता के साथ निहित करना था। यदि आप "http" नाम स्थान का उपयोग करते हैं और अपने स्वयं के SecurityContextRepository impl को इंजेक्ट करना चाहते हैं, तो "सुरक्षा-संदर्भ-रिपॉजिटरी-रेफ" विशेषता आज़माएं।

जब "http" नेमस्पेस का उपयोग किया जाता है, तो एक अलग सिक्योरिटीकोटेक्स्टपर्सिस्टेंसफिल्टर की परिभाषा को नजरअंदाज कर दिया जाता है। जैसा कि मैंने ऊपर कॉपी किया था, संदर्भ डॉक्टर। यह नहीं बताता है।

अगर मैंने चीजों को गलत समझा तो कृपया मुझे सुधार दें।


धन्यवाद, यह बहुमूल्य जानकारी है। मैं इसे अपने आवेदन में आज़माऊंगा।
जेफ इवांस

धन्यवाद, यही मैं वसंत 3.0 के साथ की जरूरत है
जस्टिन लुडविग

1
जब आप कहते हैं कि आप बहुत सटीक हैं, तो http नामस्थान एक कस्टम SecurityContextPersistenceFilter के लिए अनुमति नहीं देता है, मुझे यह पता लगाने के लिए डिबगिंग के कुछ घंटे लगे
Jaime Hablutzel

इसे पोस्ट करने के लिए धन्यवाद! मैं चीखा करने वाला था कि मेरे पास क्या छोटे बाल हैं। मैं सोच रहा था कि क्यों SecuritySontextPersistenceFilter के setSecurityContextRepository विधि को पदावनत कर दिया गया (डॉक्स कंस्ट्रक्टर इंजेक्शन का उपयोग करने के लिए कह रहा है, जो सही भी नहीं है)।
मुर्ख

10

SecurityContextPersistenceFilterकक्षा पर एक नज़र डालें । यह परिभाषित करता है कि SecurityContextHolderआबादी कैसे है। डिफ़ॉल्ट रूप से इसका उपयोग HttpSessionSecurityContextRepositoryhttp सत्र में सुरक्षा संदर्भ को संग्रहीत करने के लिए करता है।

मैंने इस तंत्र को बहुत आसानी से लागू किया है, कस्टम के साथ SecurityContextRepository

securityContext.xmlनीचे देखें :

<?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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:sec="http://www.springframework.org/schema/security"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

    <context:annotation-config/>

    <sec:global-method-security secured-annotations="enabled" pre-post-annotations="enabled"/>

    <bean id="securityContextRepository" class="com.project.server.security.TokenSecurityContextRepository"/>

    <bean id="securityContextFilter" class="com.project.server.security.TokenSecurityContextPersistenceFilter">
        <property name="repository" ref="securityContextRepository"/>
    </bean>

    <bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
        <constructor-arg value="/login.jsp"/>
        <constructor-arg>
            <list>
                <bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>
            </list>
        </constructor-arg>
    </bean>

    <bean id="formLoginFilter"
          class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <property name="authenticationManager" ref="authenticationManager"/>
        <property name="authenticationSuccessHandler">
            <bean class="com.project.server.security.TokenAuthenticationSuccessHandler">
                <property name="defaultTargetUrl" value="/index.html"/>
                <property name="passwordExpiredUrl" value="/changePassword.jsp"/>
                <property name="alwaysUseDefaultTargetUrl" value="true"/>
            </bean>
        </property>
        <property name="authenticationFailureHandler">
            <bean class="com.project.server.modules.security.CustomUrlAuthenticationFailureHandler">
                <property name="defaultFailureUrl" value="/login.jsp?failure=1"/>
            </bean>
        </property>
        <property name="filterProcessesUrl" value="/j_spring_security_check"/>
        <property name="allowSessionCreation" value="false"/>
    </bean>

    <bean id="servletApiFilter"
          class="org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter"/>

    <bean id="anonFilter" class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter">
        <property name="key" value="ClientApplication"/>
        <property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS"/>
    </bean>


    <bean id="exceptionTranslator" class="org.springframework.security.web.access.ExceptionTranslationFilter">
        <property name="authenticationEntryPoint">
            <bean class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
                <property name="loginFormUrl" value="/login.jsp"/>
            </bean>
        </property>
        <property name="accessDeniedHandler">
            <bean class="org.springframework.security.web.access.AccessDeniedHandlerImpl">
                <property name="errorPage" value="/login.jsp?failure=2"/>
            </bean>
        </property>
        <property name="requestCache">
            <bean id="nullRequestCache" class="org.springframework.security.web.savedrequest.NullRequestCache"/>
        </property>
    </bean>

    <alias name="filterChainProxy" alias="springSecurityFilterChain"/>

    <bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy">
        <sec:filter-chain-map path-type="ant">
            <sec:filter-chain pattern="/**"
                              filters="securityContextFilter, logoutFilter, formLoginFilter,
                                        servletApiFilter, anonFilter, exceptionTranslator, filterSecurityInterceptor"/>
        </sec:filter-chain-map>
    </bean>

    <bean id="filterSecurityInterceptor"
          class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
        <property name="securityMetadataSource">
            <sec:filter-security-metadata-source use-expressions="true">
                <sec:intercept-url pattern="/staticresources/**" access="permitAll"/>
                <sec:intercept-url pattern="/index.html*" access="hasRole('USER_ROLE')"/>
                <sec:intercept-url pattern="/rpc/*" access="hasRole('USER_ROLE')"/>
                <sec:intercept-url pattern="/**" access="permitAll"/>
            </sec:filter-security-metadata-source>
        </property>
        <property name="authenticationManager" ref="authenticationManager"/>
        <property name="accessDecisionManager" ref="accessDecisionManager"/>
    </bean>

    <bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
        <property name="decisionVoters">
            <list>
                <bean class="org.springframework.security.access.vote.RoleVoter"/>
                <bean class="org.springframework.security.web.access.expression.WebExpressionVoter"/>
            </list>
        </property>
    </bean>

    <bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">
        <property name="providers">
            <list>
                <bean name="authenticationProvider"
                      class="com.project.server.modules.security.oracle.StoredProcedureBasedAuthenticationProviderImpl">
                    <property name="dataSource" ref="serverDataSource"/>
                    <property name="userDetailsService" ref="userDetailsService"/>
                    <property name="auditLogin" value="true"/>
                    <property name="postAuthenticationChecks" ref="customPostAuthenticationChecks"/>
                </bean>
            </list>
        </property>
    </bean>

    <bean id="customPostAuthenticationChecks" class="com.project.server.modules.security.CustomPostAuthenticationChecks"/>

    <bean name="userDetailsService" class="com.project.server.modules.security.oracle.UserDetailsServiceImpl">
        <property name="dataSource" ref="serverDataSource"/>
    </bean>

</beans>

1
हाय लुकास, क्या आप अपने सुरक्षा संदर्भ भंडार कार्यान्वयन के बारे में अधिक जानकारी दे सकते हैं?
जिम डाउनिंग

1
क्लास टोकनसेरेसिटीकोटेक्स्ट रिपॉजिटरी में हैशपॉ </ string, SecurityContext> प्रसंग है। LoadContext () विधि में जाँच की जाती है कि सत्र हैश कोड के लिए SecurityContext मौजूद है या तो requestParameter, या कुकी, या कस्टम requestHeader या किसी भी उपरोक्त के संयोजन द्वारा पारित किया गया है। यदि संदर्भ हल नहीं किया जा सकता, तो SecurityContextHolder.createEmptyContext () लौटाता है। विधि saveContext, रेफरेंस रेफ़रेंस को संदर्भ मानचित्र पर रखता है।
लुकास हरमन

8

दरअसल create-session="never"इसका मतलब पूरी तरह से स्टेटलेस होना नहीं है। नहीं है एक मुद्दा स्प्रिंग सुरक्षा मुद्दा प्रबंधन में उस के लिए।


3

इस जवाब में पोस्ट किए गए कई समाधानों के साथ संघर्ष करने के बाद, <http>नाम स्थान के कॉन्फ़िगरेशन का उपयोग करते समय कुछ काम करने की कोशिश करने के लिए , मुझे आखिरकार एक दृष्टिकोण मिला जो वास्तव में मेरे उपयोग के मामले में काम करता है। मुझे वास्तव में इसकी आवश्यकता नहीं है कि स्प्रिंग सिक्योरिटी एक सत्र शुरू नहीं करती है (क्योंकि मैं अनुप्रयोग के अन्य भागों में सत्र का उपयोग करता हूं), बस यह कि यह सत्र में प्रमाणीकरण को "याद" नहीं करता है (इसे फिर से जांचना चाहिए हर अनुरोध)।

इसके साथ शुरू करने के लिए, मैं यह पता लगाने में सक्षम नहीं था कि ऊपर वर्णित "अशक्त कार्यान्वयन" तकनीक कैसे करें। यह स्पष्ट नहीं था कि क्या आप SecurityContextRepository को nullया किसी सेशन ऑप्‍शन पर सेट करने वाले हैं। पूर्व काम नहीं करता क्योंकि NullPointerExceptionभीतर फेंक दिया जाता है SecurityContextPersistenceFilter.doFilter()। नो-ऑप कार्यान्वयन के लिए, मैंने सबसे सरल तरीके से लागू करने की कोशिश की जिसकी मैं कल्पना कर सकता हूं:

public class NullSpringSecurityContextRepository implements SecurityContextRepository {

    @Override
    public SecurityContext loadContext(final HttpRequestResponseHolder requestResponseHolder_) {
        return SecurityContextHolder.createEmptyContext();
    }

    @Override
    public void saveContext(final SecurityContext context_, final HttpServletRequest request_,
            final HttpServletResponse response_) {
    }

    @Override
    public boolean containsContext(final HttpServletRequest request_) {
        return false;
    }

}

यह मेरे आवेदन में काम नहीं करता है, क्योंकि कुछ अजीब प्रकार के ClassCastExceptionसाथ करना है response_

यहां तक ​​कि यह मानते हुए कि मैंने एक कार्यान्वयन खोजने का प्रबंधन किया है जो काम करता है (केवल सत्र में संदर्भ को संग्रहीत नहीं करता है), अभी भी समस्या है कि <http>कॉन्फ़िगरेशन द्वारा निर्मित फ़िल्टर में कैसे इंजेक्ट किया जाए। डॉक्स केSECURITY_CONTEXT_FILTER अनुसार आप केवल स्थान पर फ़िल्टर को प्रतिस्थापित नहीं कर सकते । जिस तरह से मैं हुक में पाया जाता है कि कवर के नीचे बनाया गया है एक बदसूरत बीन लिखने के लिए था :SecurityContextPersistenceFilterApplicationContextAware

public class SpringSecuritySessionDisabler implements ApplicationContextAware {

    private final Logger logger = LoggerFactory.getLogger(SpringSecuritySessionDisabler.class);

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext_) throws BeansException {
        applicationContext = applicationContext_;
    }

    public void disableSpringSecuritySessions() {
        final Map<String, FilterChainProxy> filterChainProxies = applicationContext
                .getBeansOfType(FilterChainProxy.class);
        for (final Entry<String, FilterChainProxy> filterChainProxyBeanEntry : filterChainProxies.entrySet()) {
            for (final Entry<String, List<Filter>> filterChainMapEntry : filterChainProxyBeanEntry.getValue()
                    .getFilterChainMap().entrySet()) {
                final List<Filter> filterList = filterChainMapEntry.getValue();
                if (filterList.size() > 0) {
                    for (final Filter filter : filterList) {
                        if (filter instanceof SecurityContextPersistenceFilter) {
                            logger.info(
                                    "Found SecurityContextPersistenceFilter, mapped to URL '{}' in the FilterChainProxy bean named '{}', setting its securityContextRepository to the null implementation to disable caching of authentication",
                                    filterChainMapEntry.getKey(), filterChainProxyBeanEntry.getKey());
                            ((SecurityContextPersistenceFilter) filter).setSecurityContextRepository(
                             new NullSpringSecurityContextRepository());
                        }
                    }
                }

            }
        }
    }
}

वैसे भी, समाधान है कि वास्तव में काम करता है, यद्यपि बहुत hackish। बस Filterउस सत्र प्रविष्टि को हटाता है जिसका उपयोग HttpSessionSecurityContextRepositoryउसकी चीज़ करते समय दिखता है:

public class SpringSecuritySessionDeletingFilter extends GenericFilterBean implements Filter {

    @Override
    public void doFilter(final ServletRequest request_, final ServletResponse response_, final FilterChain chain_)
            throws IOException, ServletException {
        final HttpServletRequest servletRequest = (HttpServletRequest) request_;
        final HttpSession session = servletRequest.getSession();
        if (session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY) != null) {
            session.removeAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
        }

        chain_.doFilter(request_, response_);
    }
}

फिर कॉन्फ़िगरेशन में:

<bean id="springSecuritySessionDeletingFilter"
    class="SpringSecuritySessionDeletingFilter" />

<sec:http auto-config="false" create-session="never"
    entry-point-ref="authEntryPoint">
    <sec:intercept-url pattern="/**"
        access="IS_AUTHENTICATED_REMEMBERED" />
    <sec:intercept-url pattern="/static/**" filters="none" />
    <sec:custom-filter ref="myLoginFilterChain"
        position="FORM_LOGIN_FILTER" />

    <sec:custom-filter ref="springSecuritySessionDeletingFilter"
        before="SECURITY_CONTEXT_FILTER" />
</sec:http>

नौ साल बाद, यह अभी भी सही जवाब है। अब हम XML के बजाय जावा कॉन्फ़िगरेशन का उपयोग कर सकते हैं। मैंने अपने WebSecurityConfigurerAdapterसाथ कस्टम फ़िल्टर " http.addFilterBefore(new SpringSecuritySessionDeletingFilter(), SecurityContextPersistenceFilter.class)" में जोड़ा
कार्यकर्ताजी

3

बस एक त्वरित टिप्पणी: यह "क्रिएशन-सेशन" के बजाय "क्रिएशन-सेशन" है

बनाने के सत्र

उस उत्सुकता को नियंत्रित करता है जिसके साथ एक HTTP सत्र बनाया जाता है।

यदि सेट नहीं किया जाता है, तो "ifRequired" के लिए डिफॉल्ट होता है। अन्य विकल्प "हमेशा" और "कभी नहीं" हैं।

इस विशेषता की सेटिंग HttpSessionContextIntegrationFilter के AllowSessionCreation और forceEagerSessionCreation गुणों को प्रभावित करती है। allowSessionCreation हमेशा सच रहेगा जब तक कि यह विशेषता "कभी नहीं" पर सेट हो। ForceEagerSessionCreation "झूठा" है जब तक कि यह "हमेशा" पर सेट न हो।

इसलिए डिफ़ॉल्ट कॉन्फ़िगरेशन सत्र निर्माण की अनुमति देता है लेकिन इसे बाध्य नहीं करता है। अपवाद तब होता है जब समवर्ती सत्र नियंत्रण सक्षम किया जाता है, जब बल की स्थापना की जाती है, तो यह निर्धारित करने के लिए कि यहां क्या है, बल पर सेट किया जाएगा। "कभी नहीं" का उपयोग करने से HttpSessionContextIntegrationFilter के प्रारंभ के दौरान एक अपवाद हो जाएगा।

सत्र उपयोग के विशिष्ट विवरण के लिए, HttpSessionSecurityContextRepository javadoc में कुछ अच्छे दस्तावेज हैं।


ये सभी महान उत्तर हैं, लेकिन मैं दीवार के खिलाफ अपना सिर पीट रहा हूं ताकि यह पता लगाने की कोशिश की जा सके कि <http> कॉन्फ़िगर तत्व का उपयोग करते समय इसे कैसे प्राप्त किया जाए। यहां तक ​​कि auto-config=false, आप स्पष्ट SECURITY_CONTEXT_FILTERरूप से अपने खुद के साथ स्थिति में क्या बदल सकते हैं। मैं कुछ ApplicationContextAwareबीन के साथ इसे निष्क्रिय करने की कोशिश कर रहा हूँ, ( securityContextRepositoryएक अशक्त कार्यान्वयन के लिए मजबूर करने के लिए प्रतिबिंब का उपयोग करके SessionManagementFilter) लेकिन कोई पासा नहीं। और दुख की बात है कि मैं 3.1 साल की स्प्रिंग-सिक्योरिटी पर स्विच नहीं कर सकता create-session=stateless
जेफ इवांस

हमेशा जानकारीपूर्ण इस साइट पर जाएँ। आशा है कि यह आपकी और अन्य की मदद करता है " baeldung.com/spring-security-session " • हमेशा - एक सत्र हमेशा बनाया जाएगा यदि कोई पहले से मौजूद नहीं है • ifRequired - एक सत्र केवल तभी बनाया जाएगा यदि आवश्यक हो (डिफ़ॉल्ट) • कभी नहीं - ढांचा कभी भी एक सत्र का निर्माण नहीं करेगा, लेकिन यह एक का उपयोग करेगा यदि यह पहले से ही मौजूद है • स्टेटलेस - कोई भी सत्र वसंत सुरक्षा द्वारा नहीं बनाया जाएगा या उपयोग नहीं किया जाएगा
Java_Fire_Within
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.