2016-05-25 3 views
6

मैंने सत्र कोडआउट चेक और समरूपता जांच को सक्षम करने के लिए spring-security.xml में यह कोड जोड़ा।स्प्रिंग सिक्योरिटी में सत्र प्रबंधन (टाइमआउट/कॉन्सुरेंसी चेक) से कुछ पेज कैसे बाहर निकालें?

<sec:http> 
    <sec:form-login login-page="/login" login-processing-url="/authentication" 
        default-target-url="/home" always-use-default-target="true" 
        authentication-failure-url="/login?error=true" 
        username-parameter="userid" password-parameter="password"/> 
    <sec:logout logout-url="/logout" logout-success-url="/login" delete-cookies="JSESSIONID" invalidate-session="true" /> 

    <!-- User login (URL not View Name) --> 
    <sec:intercept-url pattern="/login" access="permitAll" /> 

    <!-- User change password --> 
    <sec:intercept-url pattern="/change_password" access="permitAll" /> 


    <sec:session-management invalid-session-url="/session_timeout"> 
     <sec:concurrency-control max-sessions="1" error-if-maximum-exceeded="false" expired-url="/session_conflict"/> 
    </sec:session-management> 

    <sec:headers> 
     <sec:frame-options policy="SAMEORIGIN" /> 
    </sec:headers> 
</sec:http> 

लेकिन सवाल यह है कि,

  1. मैं login सत्र की जांच (टाइमआउट और संगामिति) से change_password जैसे कुछ पृष्ठ को बाहर की जरूरत है।

  2. यदि मेरे पास कोई ऐसा पृष्ठ है जो लॉग इन उपयोगकर्ता या अन-लॉग किए गए उपयोगकर्ता दोनों के लिए सुलभ है। लेकिन मैं केवल उपयोगकर्ता के लॉग इन सत्र टाइमआउट और संगामिति की जांच करने की जरूरत है।

मैं यह कैसे लागू करना चाहिए?

बहुत बहुत धन्यवाद।

उत्तर

4

अद्यतन: मैंने अपने मूल session="false" का जवाब मेरे स्प्रिंग सुरक्षा लॉगिन पृष्ठों में से एक पर किया और यह काम नहीं किया। बेहतर समाधान के लिए नीचे और देखें।


मूल जवाब:

JSP फ़ाइल से शुरू किया जा रहा है एक सत्र रोकने चाहिए की चोटी पर <% @ page सत्र = "false"%> जोड़ना लेकिन इस वसंत सुरक्षा से संबंधित नहीं है।

कि नीचे दी गई यूआरएल पर कुछ बहुत ही कम से कम ओरेकल प्रलेखन नहीं है कहते हैं:

JSP डिफ़ॉल्ट सत्र अनुरोध

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

<% @ page ... सत्र = "false"%

https://docs.oracle.com/cd/A87860_01/doc/java.817/a83726/basics3.htm#1007356


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

सीआरएसएफ टोकन को एक सत्र की आवश्यकता होती है ताकि आपको केवल लॉगिन प्रक्रिया पर सीएसआरएफ परीक्षण को छोड़कर समाधान की आवश्यकता हो।

वसंत सुरक्षा संदर्भ में "Relaxing CSRF" की चर्चा है। वे विशेष रूप से सॉकजेएस का उल्लेख करते हैं लेकिन सिद्धांत सार्वभौमिक है।

http.csrf().ignoringAntMatchers("/login") 

स्वीकार किए जाते हैं answer by P.Peter for the SO question "CSRF token expires during login" एक ऐसी ही समाधान है कि एक छोटे से अधिक प्रयास की आवश्यकता है है: वे JavaConfig के लिए नीचे लाइन की तरह कुछ सुझाव देते हैं।

आप एक वर्ग है कि वसंत के RequestMatcher वर्ग को लागू करेगा जोड़ने और इसे के मैचों (ओवरराइड) विधि की जरूरत है:

class CsrfSecurityRequestMatcher implements RequestMatcher { 
    @Override 
    public boolean matches(HttpServletRequest request) { 
     return !request.getServletPath().equals("/login"); 
    } 
} 

आप अपने कस्टम RequestMatcher कक्षा में पैटर्न और RegexRequestMatcher फ़ील्ड जोड़ सकते हैं आप और अधिक जटिल मिलान तर्क की जरूरत है और उन्हें अपने मैचों() विधि में उपयोग करें।

फिर आपको अपनी स्प्रिंग सुरक्षा कॉन्फ़िगरेशन में नई कक्षा का संदर्भ जोड़ना होगा।

http.csrf().requireCsrfProtectionMatcher(new CsrfSecurityRequestMatcher()); 

मैं अनिश्चित सुरक्षा परिणाम हो सकते प्रवेश पृष्ठ पर CSRF परीक्षण अक्षम करने के लिए हो सकता है क्या कर रहा हूँ:

<http> 
    <csrf request-matcher-ref="csrfSecurityRequestMatcher"/> 
</http> 

JavaConfig में यह कुछ इस तरह होगा: एक्सएमएल में यह कुछ इस तरह होगा तो आप उसमें देखना चाह सकते हैं।

यदि आप तय करते हैं कि आपके लॉगिन पेज के लिए सीएसआरएफ को अक्षम करना अस्वीकार्य है तो आप एक एजेक्स रखरखाव समाधान का उपयोग कर सकते हैं जो आपके लॉगिन पेज को समाप्त होने से रोकता है लेकिन यह मेरे स्वाद के लिए थोड़ा सा हैकिश है।

3

सत्र वसंत, सुरक्षा इत्यादि के बावजूद बनाया गया है। सत्र के पीछे तंत्र पूरी तरह से स्वचालित है, आपको कुछ भी बदलने या करने की आवश्यकता नहीं है। वसंत विवरण में खुदाई करने के बजाय, आप सादा javax.servlet एपीआई का उपयोग कर सकते हैं और आपको जो चाहिए उसे पूरा कर सकते हैं।

और आपको जो करना है वह सरल है: सत्र-बाध्य कस्टम ऑब्जेक्ट की सहायता से अज्ञात सत्र और प्रमाणीकृत उपयोगकर्ता सत्रों के बीच अंतर करें।

सत्र ऑब्जेक्ट्स रख सकता है, और सर्वर विशिष्ट सत्र (आमतौर पर सत्र कुकी jsessionid के माध्यम से) से जुड़ी वस्तुओं को बनाए रखता है। इस तरह के एक वस्तु का उदाहरण कोड पीछा कर रहा है: घटनाओं

import java.util.logging.Logger; 
import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSessionListener; 

public class SessionListener implements HttpSessionListener { 

    public static final Logger log = Logger.getLogger(SessionListener.class.getCanonicalName()); 

    /** 
    * Method is called after new client connects 
    * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent) 
    */ 
    @Override 
    public void sessionCreated(HttpSessionEvent arg0) { 
     log.info("SESSION CREATED with id " + arg0.getSession().getId()); 
     final SessionUsr authenticatedUser = new SessionUsr(false, "anonymous"); 
     arg0.getSession().setAttribute("_USR", authenticatedUser); 
    } 

    /** 
    * Invalidation or timeout definined in web.xml (session-timeout). 
    * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent) 
    */ 
    @Override 
    public void sessionDestroyed(HttpSessionEvent arg0) { 
     log.info("SESSION DESTROYED, INVALIDATED " + arg0.getSession().getId()); 
    } 

} 

अपने प्राधिकरण और प्रमाणीकरण कोड में ट्रैक करने के लिए

public class SessionUsr implements java.io.Serializable { 
    private static final long serialVersionUID = 6034793247940424913L; 

    // do not make this fields nonfinal. This object is in session as serialized stream and 
    // setting the fields does not refresh the object in session. You must replace it 

    protected final boolean isAnonymous; 
    protected final String userName; 

    public SessionUsr(boolean isAnonymous, String userName) { 
     super(); 
     this.isAnonymous = isAnonymous; 
     this.userName = userName; 
    } 
    public boolean isAnonymous() { 
     return this.isAnonymous; 
    } 
    public String getUserName() { 
     return this.userName; 
    } 

    @Override 
    public String toString() { 
     return "SessionUsr [isAnonymous=" + this.isAnonymous + ", userName=" + this.userName + "]"; 
    } 
    @Override 
    public int hashCode() { 
     int result = 17; 
     result = 31 * result + (null == getUserName() ? 0 : getUserName().hashCode()); 
     result = 31 * result + (!isAnonymous() ? 0 : 1); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (!(obj instanceof SessionUsr)) { 
      return false; 
     } 

     final SessionUsr comparation= (SessionUsr) obj; 
     if (comparation.getUserName().equals(this.userName)) 
      return true; 

     return false; 
    } 

} 

सत्र श्रोता, उपयोगकर्ता के बाद सफलतापूर्वक मान्य है, तो आप कोड के साथ सत्र विशेषता की जगह

final SessionUsr authorizated = new SessionUsr("John Kennedy", true); 
getSession().setAttribute("_USR", authorizated); 

और आप के साथ कहीं भी इस प्रयोक्ता को पुनः प्राप्त कर सकते हैं:

final SessionUsr authenticatedUser = (SessionUsr) getSession().getAttribute("_USR"); 
संबंधित मुद्दे