2015-10-16 19 views
7

मेरी स्प्रिंग प्रोजेक्ट में, मैंने लॉगआउट लक्ष्य यूआरएल को "/ login? Logout" पर एक संदेश के साथ लॉगिन पेज प्रदर्शित करने के लिए "अब आप लॉग आउट हैं" सेट किया है।क्यों/लॉगिन? लॉगआउट रीडायरेक्ट/लॉगिन करने के लिए?

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .csrf().disable() 
      .authorizeRequests() 
      .antMatchers("/error").permitAll() 
      .anyRequest().fullyAuthenticated() 
      .and() 
      .formLogin() 
      .loginPage("/login") 
      .permitAll() 
      .successHandler(loginSuccessHandler) 
      .failureUrl("/login?error") 
      .and() 
      .httpBasic() 
      .and() 
      .logout() 
      .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) 
      .permitAll() 
      .logoutSuccessHandler(logoutSuccessHandler); 
} 

और logoutSuccessHandler:

स्प्रिंग सुरक्षा config में, मैं ऐसा किया

public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, 
     Authentication authentication) throws IOException, ServletException { 

    if (authentication != null) { 
     Log.debug(authentication.getName() + " LOGOUT !!"); 
    } 

    setDefaultTargetUrl("/login?logout"); 
    super.onLogoutSuccess(request, response, authentication);  
} 

जब मैं लॉगआउट करने की कोशिश, मैं पृष्ठ पर पहुंच "/ लॉगिन" (बिना ?लोग आउट)। मुझे समझ में नहीं आता कि यह मुझे इस पृष्ठ पर क्यों रीडायरेक्ट करता है।

मुझे लगता है कि एप्लिकेशन मुझे "/ login? Logout" पर रीडायरेक्ट करने का प्रयास कर रहा है, लेकिन चूंकि अब मैं कनेक्ट नहीं हूं, वसंत सुरक्षा मुझे फिर से लॉग इन करना चाहती है।

जब मैं लॉग इन करते समय "/ login? Logout" पृष्ठ तक पहुंचने का प्रयास करता हूं, तो यह अच्छा पृष्ठ प्रदर्शित करता है।

मैं इस जोड़कर इस समस्या का समाधान मिल गया:

  .authorizeRequests() 
      .antMatchers("/error","/login").permitAll() 

loginPage("/login").permitAll() ऐसा क्यों नहीं किया? क्या मैंने कुछ गलत किया?

उत्तर

10

क्योंloginPage("/login").permitAll()/login?logoutके लिए उपयोग की अनुमति नहीं है?

क्योंकि जब आप एक FormLoginConfigurer पर permitAll करते हैं, या उस बात के लिए सबसे अन्य configurers, तो वह केवल उन exact URLs के लिए उपयोग की अनुमति देगा।

अच्छा,authorizeRequests().antMatchers("/login").permitAll()तब तक पहुंच की अनुमति क्यों देता है?

क्योंकि यह AntPathRequestMatcher का उपयोग करता है, जो matches on the request path only, और पथ does not contain the query string है।

लेकिन मैं जानता हूँ कि मैं बिना किसी स्पष्टpermitAll बिल्कुल मुझे देता है कि पहुँच/login?logoutकोड देखा है। उसके साथ क्या है?

वसंत सुरक्षा "समझदार" डिफ़ॉल्ट प्रदान करना पसंद करती है, और ऐसा लगता है कि यदि कोई निर्दिष्ट नहीं है तो डिफ़ॉल्ट लॉगिन और लॉगआउट पृष्ठों को प्रदान करने के लिए यह "समझदार" है। डिफ़ॉल्ट लॉगआउट पृष्ठ /login?logout है, इसलिए यदि आप कुछ भी निर्दिष्ट नहीं करते हैं तो आप इसका उपयोग कर सकते हैं। यह DefaultLoginPageGeneratingFilter द्वारा किया जाता है जो कुछ HTML और short-circuits URL authorization स्वत: उत्पन्न करता है।

तो क्यों मैं पहुँच डिफ़ॉल्ट/login?logoutपेज जब मैं एकlogoutSuccessHandlerनिर्दिष्ट खो सकता हूँ?

जब आप निर्दिष्ट अपनी खुद की logoutSuccessHandler या logoutSuccessUrl, स्प्रिंग सुरक्षा मान लिया गया है आप अपने खुद के लॉगआउट विचारों प्रदान कर रहे हैं, तो यह लॉगआउट पृष्ठ पर DefaultLoginPageGeneratingFilter शॉर्ट सर्किट के लिए URL प्राधिकरण प्रारंभ नहीं होता है, और आप प्राधिकरण कॉन्फ़िगर करने की उम्मीद अपने विचारों पर खुद को।

लेकिन मैं डिफ़ॉल्ट लॉगआउट पृष्ठ रखना चाहता हूं। मैं बस कुछ कस्टम अतिरिक्त हैंडलिंग जोड़ना चाहता हूं। क्या मैं बस ऐसा नहीं कर सकता?

आप अपने खुद के logoutSuccessHandler निर्दिष्ट करने के लिए, लेकिन अभी भी डिफ़ॉल्ट /login?logout दृश्य रखना चाहते हैं तो आपको DefaultLoginPageGeneratingFilter बताने के लिए अभी भी यह उपलब्ध कराने रखना है। इस प्रकार आप एक कस्टम SecurityConfigurer साथ ऐसा कर सकते,:

.logoutSuccessHandler(logoutSuccessHandler) 
.and() 
.apply(new SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity>() { 
    @Override public void configure(HttpSecurity builder) throws Exception { 
     builder.getSharedObject(DefaultLoginPageGeneratingFilter.class).setLogoutSuccessUrl("/login?logout"); 
    } 
}) 
+1

सबसे उत्कृष्ट - मैं इस का सबसे स्पष्ट करना कोड के माध्यम से रेंगने द्वारा प्रबंधित किया था, लेकिन मैं 'SecurityConfigurerAdapter' याद आ रही थी। आपके उत्तर के लिए धन्यवाद और हम कुछ दिनों में बक्षीस के बारे में देखेंगे। –

+0

ठीक है - लेकिन एक कैच 22 है! यदि कोई कस्टम हैंडलर सेट करता है, तो यूआरएल स्प्रिंग _resets_। यदि कोई कस्टम यूआरएल सेट करता है, तो स्प्रिंग हैंडलर रीसेट करता है। इसलिए, जबकि 'सुरक्षा कॉन्फ़िगरर एडाप्टर' उपयोगी है; एक कस्टम, कहने, विफलता हैंडलर के लिए एक तरीका है (जब तक मैं कुछ याद नहीं कर रहा हूं), और वसंत को 'permitAll' सही ढंग से स्वत: कॉन्फ़िगर करें, इसके अलावा,' ExactUrlRequestMatcher' का उपयोग 'निजी' है, इसलिए कोई भी कुछ नहीं कर सकता समान रूप से समान ... –

+0

एपीआई बहुत नाजुक है, लेकिन मुझे यकीन नहीं है कि आप वास्तव में क्या पूछ रहे हैं। क्या आप अपना टूटा हुआ कोड पोस्ट कर सकते हैं और मैं इसे मिनी-प्रश्न के रूप में संबोधित करने की कोशिश करूंगा? कृपया यह भी निर्दिष्ट करें कि क्या आप 'DefaultLoginPageConfigurer' का उपयोग करने का प्रयास कर रहे हैं या आपके पास अपने स्वयं के दृश्य टेम्पलेट हैं। – heenenee

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