2016-01-22 11 views
7

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

मैं कुछ उदाहरण हैं, जहां कुछ इस तरह लिखा है ऊपर देखा:

@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter 
{ 

    [...] 

    @Override 
    protected void configure(HttpSecurity http) throws Exception 
    { 
     http 
      .authorizeRequests() 
       .antMatchers("/login**").permitAll() 
       .antMatchers("/UIDL/**").permitAll() 
       .antMatchers("/HEARTBEAT/**").authenticated() 
       .antMatchers("/VAADIN/**").permitAll() 
       .antMatchers("/resources/**").permitAll() 
       .anyRequest().authenticated() 
       .and() 
      .formLogin().loginPage("/login").permitAll() 
       .and() 
      .logout().permitAll() 
       .and() 
      .csrf().disable(); 
    } 
} 

क्योंकि मैं प्रवेश पृष्ठ मैं Thymeleaf engine का उपयोग डिजाइन करने के लिए चाहते हैं। इसलिए मैं इस नियंत्रक वर्ग का उपयोग कर रहा:

@Controller 
public class LoginController 
{ 
    @RequestMapping("/login") 
    String login(Model model) 
    { 
     return "login"; 
    } 
} 

कौन सा .antMatchers() मैं परिभाषित करना चाहिए अगर मैं अगर उपयोगकर्ता प्रवेश न होने पर अपने आवेदन के हर अनुरोध को ब्लॉक करना चाहते हैं? मुझे पता है कि मुझे सीएसएस और छवियों को प्राप्त करने के लिए लॉगिन पेज के लिए antMatchers ("/ resource/**") permitAll() को परिभाषित करना है। लेकिन ये पैटर्न क्या हैं "/ यूआईडीएल/**" और मुझे उनके लिए क्या चाहिए?

उत्तर

4

कौन सा .antMatchers() मुझे परिभाषित करना चाहिए कि अगर मैं लॉग इन नहीं करता हूं तो मैं अपने आवेदन के प्रत्येक अनुरोध को अवरुद्ध करना चाहता हूं?

तुम सिर्फ हर अनुरोध को ब्लॉक करना चाहते हैं, तो उपयोगकर्ता में लॉग इन नहीं कर रहा है:

@Override 
protected void configure(HttpSecurity http) throws Exception 
{ 
    http 
     .authorizeRequests() 
      .anyRequest().authenticated() 
      .and() 
     .formLogin() 
      .loginPage("/login").permitAll() 
      .and() 
     .logout().permitAll() 
      .and() 
     .csrf().disable(); 
} 

आप वास्तव में नहीं है किसी भी antMatcher की जरूरत है, प्रवेश पृष्ठ के लिए भी नहीं, .formLogin() में के रूप में भाग, आप पहले से ही उस पृष्ठ के लिए .permitAll() शामिल हैं।

निश्चित संसाधनों (सीएसएस, जे एस, चित्र) के लिए और मन में VAADIN साथ

अब आप इस अधिभावी एक और तरीका कर सकते हैं: एक स्प्रिंग बूट परियोजना के साथ

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring() 
     .antMatchers("/resources/**", "/VAADIN/**"); 
} 

, मैं भी मुद्दा नहीं मिला अगर मैं नहीं था ' web.ignoring().antMatchers(...) में अनुरोधों को "/vaadinServlet/**" पर अनुमति दें।

"/ UIDL/**" जैसे पैटर्न क्या हैं और मुझे उनके लिए क्या चाहिए?

जब सर्वर को अनुरोध प्राप्त होता है, तो वसंत सुरक्षा इन पैटर्न का उपयोग यह निर्धारित करने के लिए करती है कि उसे अनुरोध तक पहुंच को अस्वीकार या अस्वीकार कर देना चाहिए या नहीं।

वे आपके आवेदन की संदर्भ रूट के बाद यूआरआई के हिस्से का प्रतिनिधित्व करते हैं, उदा। आपके संदर्भ जड़ / जा रहा है के मामले में, तो http://server.com/UIDL/hello यूआरआई के हिस्से की तरह एक अनुरोध है कि वसंत सुरक्षा मौसम का निर्धारण करने के acces देने में करेगा या /UIDL/hello

** किसी भी उप स्तर, उदा सहित कुछ भी प्रतिनिधित्व करता नहीं होगा /UIDL/** पैटर्न के लिए, अनुरोध /UIDL/hello/world/and/any/more/levels मिलान करेगा।

एक भी * है जो कुछ भी प्रस्तुत करता है, लेकिन सब स्तरों सहित, उदाहरण के लिए /UIDL/* पैटर्न के लिए, अनुरोध /UIDL/hello मिलान करेगा, लेकिन /UIDL/hello/world नहीं।

VAADIN विचारों और UI के लिए के रूप में, मुझे यकीन है कि है कि यह antMatchers उपयोग करने के लिए अनुदान या एक्सेस को स्वीकार किया जा सकता है नहीं कर रहा हूँ, लेकिन इसके बजाय आप @EnableGlobalMethodSecurity(prePost = enabled) साथ विन्यास वर्ग व्याख्या और फिर आगे @PreAuthorize(/* spel expression */) एनोटेशन उपयोग करने में सक्षम हो सकता है पहुंच देने या अस्वीकार करने के विचार।

अद्यतन: सवाल टिप्पणी करने के लिए उत्तर देना:

  1. आप कॉन्फ़िगर (WebSecurity वेब) पहुंच की अनुमति देते साथ कॉन्फ़िगर (HttpSecurity http) के बजाय संसाधनों की अनदेखी के साथ विधि का प्रयोग क्यों करते हैं? क्या महत्वपूर्ण मतभेद हैं?

अंतर यह है कि WebSecurity#ignoring() अनुरोध स्प्रिंग सुरक्षा फिल्टर श्रृंखला से छोड़ दिया जा रहा है बनाता है, और यह सुझाया गया तरीका स्थिर संसाधनों के लिए, निश्चित संसाधनों से कुछ और configure(HttpSecurity http) अंदर कार्रवाई की जानी चाहिए है।

source

  1. क्यों आप "/ VAADIN/**" पथ की उपेक्षा करते हैं?

क्योंकि उस पथ विषयों, विजेट सेट, और अनुकूलन है, जो स्थिर सामग्री है सेवा करने के लिए प्रयोग किया जाता है, पथ उत्पादन वातावरण में, Vaadin जार से dinamycally यह सेवा करने के लिए प्रयोग किया जाता है, लेकिन जैसा कि Vaadin दस्तावेज में सुझाव दिया स्थिर रूप से परोसा जाना चाहिए, क्योंकि यह तेज़ है।

source

  1. मैं "/ *" और "/ **" का अर्थ कल्पना कर सकता है, लेकिन क्या "UIDL" और "दिल की धड़कन" वास्तव में क्या मतलब है? उन्हें अनुमति क्यों है?

UIDL:

उपयोगकर्ता इंटरफ़ेस परिभाषा भाषा (UIDL) एक ब्राउज़र के लिए वेब सर्वर से प्रतिक्रिया में serializing यूजर इंटरफेस सामग्री और परिवर्तन के लिए एक भाषा है। विचार यह है कि सर्वर-साइड घटक भाषा के साथ स्वयं "पेंट" स्क्रीन (एक वेब पेज) पर "पेंट" करें। यूआईडीएल संदेशों को ब्राउज़र में पार्स किया गया है और जीडब्ल्यूटी विजेट में अनुवाद किया गया है।

source

हार्टबीट अनुरोध की पुष्टि है कि कनेक्शन अभी भी सर्वर और ग्राहक, या सत्र के बीच जिंदा समाप्त हो गई है नहीं किया है समय-समय पर प्रदर्शन कर रहे हैं।

source - see sections 4.8.5, 4.8.6, 4.8.7 and 4.8.8

+0

आपके उत्तर के लिए धन्यवाद। 1. आप ** कॉन्फ़िगरेशन (HSpSecurity http) ** के बजाय संसाधनों को अनदेखा करने के साथ ** कॉन्फ़िगरेशन (वेब ​​सुरक्षा सुरक्षा वेब) ** विधि का उपयोग क्यों करते हैं? क्या महत्वपूर्ण मतभेद हैं? 2. आप "/ VAADIN/**" पथ को क्यों अनदेखा करते हैं? 3. मैं "/ *" और "/ **" के अर्थ की कल्पना कर सकता हूं, लेकिन "यूआईडीएल" और "हार्टबेट" का वास्तव में क्या अर्थ है? उन्हें अनुमति क्यों है? – shinchillahh

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