2015-03-06 7 views
6

शुद्ध स्प्रिंग जावा कॉन्फ़िगरेशन का उपयोग करके मुझे सिंगल साइन आउट आउट स्प्रिंग और सीएएस को सिंगल साइन आउट करने में परेशानी हो रही है। मेरे पास नीचे कॉन्फ़िगरेशन के साथ काम करने पर सिंगल साइन ऑन है। मैं यूआरएल https://nginx.shane.com/app/logout पर एक फॉर्म पोस्ट करने के लिए एक साधारण जेएसपी पेज का उपयोग करता हूं और इसमें POST'd डेटा में सीएसआरएफ मान शामिल है। यह सब कुछ त्रुटियों के साथ काम करने लगता है लेकिन जब मैं एक सुरक्षित पृष्ठ पर जाता हूं तो यह मुझे लॉगिन करने की आवश्यकता के बिना वापस देता है। कोई विचार?स्प्रिंग सिक्योरिटी और सीएएस

@Configuration 
@EnableWebSecurity 
public class SecurityWebAppConfig extends WebSecurityConfigurerAdapter { 

@Bean 
protected ServiceProperties serviceProperties() { 
    ServiceProperties serviceProperties = new ServiceProperties(); 
    serviceProperties.setService("https://nginx.shane.com/app/j_spring_cas_security_check"); 
    serviceProperties.setSendRenew(false); 
    return serviceProperties; 
} 

@Bean 
public CasAuthenticationProvider casAuthenticationProvider() { 
    CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider(); 
    casAuthenticationProvider.setAuthenticationUserDetailsService(authenticationUserDetailsService()); 
    casAuthenticationProvider.setServiceProperties(serviceProperties()); 
    casAuthenticationProvider.setTicketValidator(cas20ServiceTicketValidator()); 
    casAuthenticationProvider.setKey("an_id_for_this_auth_provider_only"); 
    return casAuthenticationProvider; 
} 

@Bean 
public AuthenticationUserDetailsService<CasAssertionAuthenticationToken> authenticationUserDetailsService() { 
    return new TestCasAuthenticationUserDetailsService(); 
} 

@Bean 
public Cas20ServiceTicketValidator cas20ServiceTicketValidator() { 
    return new Cas20ServiceTicketValidator("https://nginx.shane.com/cas"); 
} 

@Bean 
public CasAuthenticationFilter casAuthenticationFilter() throws Exception { 
    CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter(); 
    casAuthenticationFilter.setAuthenticationManager(authenticationManager()); 
    return casAuthenticationFilter; 
} 

@Bean 
public CasAuthenticationEntryPoint casAuthenticationEntryPoint() { 
    CasAuthenticationEntryPoint casAuthenticationEntryPoint = new CasAuthenticationEntryPoint(); 
    casAuthenticationEntryPoint.setLoginUrl("https://nginx.shane.com/cas/login"); 
    casAuthenticationEntryPoint.setServiceProperties(serviceProperties()); 

    return casAuthenticationEntryPoint; 
} 

@Bean 
public SingleSignOutFilter singleSignOutFilter() { 
    // This filter handles a Single Logout Request from the CAS Server 
    return new SingleSignOutFilter(); 
} 

@Bean 
public LogoutFilter requestLogoutFilter() { 
    // This filter redirects to the CAS Server to signal Single Logout should be performed 
    SecurityContextLogoutHandler handler = new SecurityContextLogoutHandler(); 
    handler.setClearAuthentication(true); 
    handler.setInvalidateHttpSession(true); 

    LogoutFilter logoutFilter = new LogoutFilter("https://nginx.shane.com/", handler); 
    return logoutFilter; 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.addFilter(casAuthenticationFilter()); 
    http.addFilterBefore(requestLogoutFilter(), LogoutFilter.class); 
    http.addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class); 

    http.exceptionHandling() 
     .authenticationEntryPoint(casAuthenticationEntryPoint()); 

    http.authorizeRequests() 
     .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
     .antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')"); 

    http.logout() 
     .addLogoutHandler(handler) 
     .deleteCookies("remove") 
     .invalidateHttpSession(true) 
     .logoutUrl("/logout") 
     .logoutSuccessUrl("/"); 
} 

@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(casAuthenticationProvider()); 
} 

}

मैं भी नष्ट कर दिया घटना सत्र को संभालने के लिए एक WebListener कहा:

@WebListener 
public class SecurityWebListener implements HttpSessionListener { 

private SingleSignOutHttpSessionListener listener = new SingleSignOutHttpSessionListener(); 

@Override 
public void sessionCreated(HttpSessionEvent se) { 
    listener.sessionCreated(se); 
} 

@Override 
public void sessionDestroyed(HttpSessionEvent se) { 
    listener.sessionDestroyed(se); 
} 
} 

यहाँ लॉग उत्पादन

[org.springframework.security.web.FilterChainProxy] [/logout at position 6 of 14 in additional filter chain; firing Filter: 'LogoutFilter'] [] 
[org.springframework.security.web.util.matcher.AntPathRequestMatcher] [Checking match of request : '/logout'; against '/logout'] [] 
[org.springframework.security.web.authentication.logout.LogoutFilter] [Logging out user 'org.spr[email protected]836ad34b: Principal: [email protected]: Username: admin; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]fffdaa08: RemoteIpAddress: 127.0.0.1; SessionId: FA880C15EF09C033E1CA0C8E4785905F; Granted Authorities: ROLE_ADMIN Assertion: [email protected] Credentials (Service/Proxy Ticket): ST-23-1UandqRxBcG6HCTx0Pdd-cas01.example.org' and transferring to logout destination] [] 
[org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler] [Invalidating session: FA880C15EF09C033E1CA0C8E4785905F] [] 
[org.jasig.cas.client.session.HashMapBackedSessionMappingStorage] [Attempting to remove Session=[FA880C15EF09C033E1CA0C8E4785905F]] [] 
[org.jasig.cas.client.session.HashMapBackedSessionMappingStorage] [Found mapping for session. Session Removed.] [] 
[org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler] [Using default Url: /] [] 
[org.springframework.security.web.DefaultRedirectStrategy] [Redirecting to '/app/'] [] 

उत्तर

3

(अन) भाग्यशाली मैं इसी तरह की समस्या थी है ;) ऐसा तब होता है जब सीएएस लॉग आउट करने के लिए आपके आवेदन को कॉल करने का प्रयास करता है। एक तरफ सीएएस सत्र पास करने की कोशिश करता है ID लॉगआउट करने के लिए, दूसरी तरफ स्प्रिंगसेक्चर को सीएसआरएफ टोकन प्राप्त करने की उम्मीद है, जिसे सीएएस द्वारा नहीं भेजा गया क्योंकि यह केवल जीईटी अनुरोध भेजता है। सीएसआरएफफ़िल्टर को सीएसआरएफ टोकन नहीं मिलता है और फिल्टर श्रृंखला में बाधा डालती है। उपयोगकर्ता को इसके बारे में पता नहीं है क्योंकि सीएएस लॉगआउट अनुरोध को पूरी तरह से कॉल करता है। अनुरोध सीधे वेब सर्वर में उपयोगकर्ता को रीडायरेक्ट करके नहीं, सीएएस सर्वर से एप्लिकेशन सर्वर पर जाता है।

ताकि इसे आप HttpSecurity कॉन्फ़िगर करने के लिए बाहर करने के लिए/LogoutFilter filterProcessesUrl (जो आपके मामले में j_spring_security_logout है के रूप में आप डिफ़ॉल्ट से एक का उपयोग) शामिल करने के लिए नहीं की जरूरत है काम करने के लिए है।

यह मानते हुए कि आप CSRF जाँच करना चाहते हैं, नए व्यवस्थापक बनाने का प्रयास कर insatnce के लिए, आप इस प्रकार के रूप में यह विन्यस्त करने की जरूरत:, मैं जोड़ लिया है

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.addFilter(casAuthenticationFilter()); 
    http.addFilterBefore(requestLogoutFilter(), LogoutFilter.class); 
    http.addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class); 

    http.exceptionHandling() 
     .authenticationEntryPoint(casAuthenticationEntryPoint()); 

    http.authorizeRequests() 
     .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
     .antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')"); 

    http.csrf() 
     .requireCsrfProtectionMatcher(new AntPathRequestMatcher("/admin/create")); 

    http.logout() 
     .addLogoutHandler(handler) 
     .deleteCookies("remove") 
     .invalidateHttpSession(true) 
     .logoutUrl("/logout") 
     .logoutSuccessUrl("/"); 
} 

बस से संकेत मिलता है

http.csrf().requireCsrfProtectionMatcher(new AntPathRequestMatcher("/admin/create"));

ध्यान दें कि आप सभी पैटर्न (/ admin/**) का मिलान नहीं कर सकते हैं क्योंकि आप संभावित रूप से कुछ अनुरोध भी कॉल करना चाहते हैं और सीएसआरएफ फ़िल्टर उन्हें टोकन भेजने की अपेक्षा करेगा।

क्रॉस साइट अनुरोध फोर्जरी (सीएसआरएफ) समर्थन शुरू होने के बाद से ऐसी समस्या 3.2.x से पहले वसंत सुरक्षा के साथ नहीं उभरती है।

आशा है कि ये मदद :)

+0

धन्यवाद, इससे मदद मिली है। –

संबंधित मुद्दे