2016-02-04 8 views
12

मैं वसंत बूट + जर्सी + स्प्रिंग सुरक्षा का उपयोग कर रहा है, मैं सार्वजनिक और निजी अंतिमबिंदुओं करना चाहते हैं, मैं इस प्रकार एक स्कीमा हैं:उपयोग अलग अलग रास्तों

  • / आराम - मेरी जड़ संदर्भ
  • /सार्वजनिक - मैं इस संदर्भ में मेरी सार्वजनिक अंतिमबिंदुओं रखना चाहते हैं, यह /rest/public/pings
  • /निजी की तरह जड़ संदर्भ के अंदर होना चाहिए - मैं चाहता हूँ प्लेसमेंट ई इस संदर्भ में मेरे निजी अंतिमबिंदुओं, ऐसा लगता है कि /rest/private/accounts

जड़ संदर्भ के अंदर होना चाहिए मैं इस प्रकार मेरी विन्यास है:

जर्सी विन्यास:

@Configuration 
@ApplicationPath("/rest") 
public class RestConfig extends ResourceConfig { 
    public RestConfig() { 
     register(SampleResource.class); 
    } 
} 

स्प्रिंग सुरक्षा कॉन्फ़िगरेशन:

@Configuration 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

........ 

    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/rest/public/**").permitAll(); 
     http.antMatcher("/rest/**").authorizeRequests().anyRequest().fullyAuthenticated().and().httpBasic(); 
     http.csrf().disable(); 
    } 

} 

सवाल यह है कि मैं अपने/बाकी संदर्भ के अंदर दो आवेदन पथ कैसे पंजीकृत कर सकता हूं, एक/सार्वजनिक और दूसरे के लिए/निजी?

नोट: मैं इस प्रकार एक और ResourceConfig बनाने की कोशिश की:

@Configuration 
@ApplicationPath("/rest/public") 
public class RestPublicConfig extends ResourceConfig{ 
    public RestPublicConfig() { 
     register(PingResource.class); 
    } 
} 

लेकिन मैं अगले त्रुटि हो रही है:

No qualifying bean of type [org.glassfish.jersey.server.ResourceConfig] is defined: expected single matching bean but found 2: restConfig,restPublicConfig 

आपकी मदद :)

उत्तर

0

आप जीत के लिए धन्यवाद आपके संसाधन वर्ग के लिए दो सेम बनाने की अनुमति नहीं है। आप एक संसाधन संसाधन का उपयोग करके हासिल करने की कोशिश कर रहे हैं जो आप प्राप्त कर सकते हैं।

यहाँ एक उदाहरण है:

@Path("rest") 
public class SampleResourceClass { 

    @Path("/public/pings") 
    @GET 
    public Responce getPings(){ 
    /* Code Here */ 
    } 

    @Path("/private/accounts") 
    @GET 
    public Response getAccounts(){ 
    /* Code Here */ 
    } 
} 
+0

हाँ, मैं इस बात को समझ, लेकिन मैं कई सार्वजनिक अंतिमबिंदुओं बनाना चाहते हैं , और इस तरह से मैं केवल इस वर्ग का उपयोग कर सकता हूं। –

0

त्रुटि आप देख रहे हैं अपनी सुरक्षा config से संबंधित नहीं है, तो आप इस टिकट पर एक नज़र लेने के लिए चाहते हो सकता है, https://github.com/spring-projects/spring-boot/issues/3260

की अनुमति चाहते हैं पिछले /public के अंतराल पर सभी ट्रैफिक आप स्प्रिंग सिक्योरिटी अनदेखा सूची में RequestMatcher जोड़ सकते हैं।

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    public void configure(WebSecurity web) throws Exception { 

     web.ignoring().antMatchers("/rest/public/**"); 
    } 

    protected void configure(HttpSecurity http) throws Exception { 

      http.authorizeRequests().antMatcher("/rest/private/**") 
      .anyRequest().authenticated().and() 
      .httpBasic().and() 
      .csrf().disable() 
    } 

} 

http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#jc

8

एक सर्वलेट कंटेनर में, जर्सी क्रम, या तो एक सर्वलेट के रूप में या एक सर्वलेट फिल्टर के रूप में चलाता है। कैसे वसंत बूट कॉन्फ़िगर करता है servlets और फ़िल्टर क्रमशः ServletRegistrationBean एस और FilterRegistrationBeans के माध्यम से है।कैसे है कि विन्यास पर्दे के पीछे काम करता है की एक विचार पाने के लिए आपको JerseyAutoConfiguration

JerseyAutoConfiguration में के लिए स्रोत कोड को देख सकते हैं, जैसा कि आप देख सकते हैं कि एक ResourceConfig इंजेक्ट किया जाता है, और कहा कि ResourceConfig जर्सी सर्वलेट बनाने के लिए प्रयोग किया जाता है या जर्सी फ़िल्टर (कॉन्फ़िगरेशन की अपनी पसंद के आधार पर)। तो त्रुटि का कारण यह है कि आप अस्पष्ट बीन्स नहीं हो सकते हैं, जिसमें आपके पास दो ResourceConfig बीन्स हैं। तो वसंत नहीं जानता कि कौन सा इंजेक्ट करना है।

क्या आप कर सकते हैं, हालांकि प्रत्येक ResourceConfig के लिए दो अलग-अलग servlets का उपयोग करें। समस्या यह है कि स्प्रिंग बूट केवल जर्सी के लिए एक सर्वलेट के साथ आपको हुक करता है, इसलिए आपको दूसरे को स्वयं कॉन्फ़िगर करने की आवश्यकता है।

  1. जर्सी अनुप्रयोगों में से एक के लिए स्प्रिंग बूट ऑटो विन्यास का प्रयोग करें, और अपने अन्य एक के लिए एक और ServletRegistrationBean जोड़ने: वहाँ दो विकल्प हैं। ध्यान देने योग्य बात यह है कि आपके बनाए गए ServletRegistrationBean के लिए ResourceConfig स्प्रिंग घटक नहीं होना चाहिए (यानी @Component या @Configuration), या फिर भी आपको एक ही त्रुटि का सामना करना पड़ेगा।

    public class PublicConfig extends ResourceConfig { 
        public PublicConfig() { 
         register(PingResource.class); 
        } 
    } 
    ... 
    // in your Spring Boot configuration class 
    @Bean 
    public ServletRegistrationBean publicJersey() { 
        ServletRegistrationBean publicJersey 
          = new ServletRegistrationBean(new ServletContainer(new PublicConfig())); 
        publicJersey.addUrlMappings("/rest/public/*"); 
        publicJersey.setName("PublicJersey"); 
        publicJersey.setLoadOnStartup(0); 
        return publicJersey; 
    } 
    
  2. बिल्कुल स्प्रिंग बूट विन्यास का प्रयोग न करें। बस दो ServletRegistrationBean एस बनाएं। इस मामले में, आपके ResourceConfig कक्षाओं में से कोई भी वसंत सेम नहीं होना चाहिए।

    @Bean 
    public ServletRegistrationBean publicJersey() { 
        ServletRegistrationBean publicJersey 
          = new ServletRegistrationBean(new ServletContainer(new PublicConfig())); 
        publicJersey.addUrlMappings("/rest/public/*"); 
        publicJersey.setName("PublicJersey"); 
        publicJersey.setLoadOnStartup(0); 
        return publicJersey; 
    } 
    
    @Bean 
    public ServletRegistrationBean privateJersey() { 
        ServletRegistrationBean privateJersey 
          = new ServletRegistrationBean(new ServletContainer(new PrivateConfig())); 
        privateJersey.addUrlMappings("/rest/private/*"); 
        privateJersey.setName("PrivateJersey"); 
        privateJersey.setLoadOnStartup(1); 
        return privateJersey; 
    } 
    

व्यक्तिगत रूप से, मैं दूसरा विकल्प पसंद करते हैं, के रूप में यह विन्यास के बारे में तर्क करने के लिए जब वे एक ही स्थान पर सभी कर रहे हैं आसान है।

नोट करने के लिए एक और बात है कि दो जर्सी अनुप्रयोगों पूरी तरह से स्वतंत्र हो जाएगा, जिसका अर्थ है आप दोनों अनुप्रयोगों के लिए (फ़िल्टर) प्रदाताओं पंजीकरण करना होगा है

+0

मैंने दूसरा विकल्प इस्तेमाल किया, बहुत बहुत धन्यवाद, यह वास्तव में सहायक था :) –

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