2015-02-16 9 views
22

मैं जेवीस्टर से कुछ प्रेरणा के साथ डेव सीयर द्वारा गाइड का उपयोग करके ओएथ 2 प्रमाणीकरण सर्वर को कार्यान्वित करने का प्रयास कर रहा हूं। लेकिन मैं यह नहीं समझ सकता कि यह सब एक साथ कैसे काम करता है।वसंत सुरक्षा OAuth2, जो सुरक्षा का फैसला करता है?

ऐसा लगता है कि जब मैं ResourceServerConfigurerAdapter का उपयोग करता हूं तो WebSecurityConfigurerAdapter का उपयोग करके सुरक्षा सेटअप ओवरराइट किया जाता है।

@Configuration 
@EnableResourceServer 
public class OAuth2ResourceConfig extends ResourceServerConfigurerAdapter { 

    private TokenExtractor tokenExtractor = new BearerTokenExtractor(); 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
       .addFilterAfter(contextClearer(), AbstractPreAuthenticatedProcessingFilter.class) 
       .authorizeRequests() 
       .anyRequest().authenticated().and().httpBasic(); 
    } 

    private OncePerRequestFilter contextClearer() { 
     return new OncePerRequestFilter() { 
      @Override 
      protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
       if (tokenExtractor.extract(request) == null) { 
        SecurityContextHolder.clearContext(); 
       } 
       filterChain.doFilter(request, response); 
      } 
     }; 
    } 

@Component 
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { 

    private final AuthenticationManager authenticationManager; 

    @Autowired 
    public CustomWebSecurityConfigurerAdapter(AuthenticationManager authenticationManager) { 
     this.authenticationManager = authenticationManager; 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
       .parentAuthenticationManager(authenticationManager); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .formLogin() 
        .loginPage("/login").permitAll() 
       .and() 
        .authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 
       .and() 
        .requestMatchers().antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access") 
       .and() 
        .authorizeRequests().anyRequest().authenticated(); 
    } 
} 

यह कोड कुछ अलग उदाहरणों से लिया गया है, इसलिए वे इसे अच्छी तरह से मिश्रण नहीं कर सकते हैं। लेकिन मुझे OAuth2 के लिए एक अच्छी प्रलेखन/उदाहरण सूची नहीं मिल रही है (स्प्रिंग बूट के विपरीत जिसमें एक शानदार दस्तावेज है), इसलिए मुझे यह समझने में समस्याएं आ रही हैं कि कैसे सभी एक साथ फिट होते हैं। यदि मैं ResourceServerConfigurerAdapter में लॉगिनफॉर्म नहीं जोड़ता, तो यह मुझे केवल अनधिकृत कर देगा। लेकिन मैंने इसे WebSecurityConfigurererAdapter में permitAll() के रूप में परिभाषित किया है।

@Configuration 
@EnableAuthorizationServer 
public class OAuth2AuthorizationConfig extends AuthorizationServerConfigurerAdapter { 

    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Autowired 
    private JwtAccessTokenConverter jwtAccessTokenConverter; 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.inMemory() 
       .withClient("acme") 
       .secret("acmesecret") 
       .authorizedGrantTypes("authorization_code", "refresh_token", 
         "password").scopes("openid"); 
    } 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     endpoints.authenticationManager(authenticationManager).accessTokenConverter(jwtAccessTokenConverter); 
    } 

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
     oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()"); 
    } 
} 

कुछ भी मैं गलत कर रहा हूँ:

यह AuthorizationServerConfigurerAdapter है? क्या मुझे ResourceServerConfigurerAdapter के भीतर सभी सुरक्षा सेट अप करना है? क्या मुझे अब भी WebSecurityConfigurerAdapter की आवश्यकता है?

यदि किसी को भी कोई गाइड, ट्यूटोरियल, ब्लॉग या कुछ भी पता है जो मुझे इस काम के आसपास अपने सिर को लपेटने में मदद कर सकता है, तो इसकी सराहना की जाएगी।

दयालु संबंध, केनेथ।

+0

आपका 'OAuth2ResourceConfig' जहां तक ​​मैं देख सकता हूं अनावश्यक है। बस केह रहा हू। –

+0

लक्षण क्या हैं (आप किन पथों को मार रहे हैं और आप क्या देखते हैं)? कर्ल का उपयोग करना (हेडर देखने के लिए -v) और स्प्रिंग सिक्योरिटी के लिए डेबग लॉगिंग आपको जो कुछ जानने की जरूरत है उसे बताना चाहिए। –

+0

लक्षण यह था कि यह मूल रूप से WebSecurityConfigurerAdapter को अनदेखा कर दिया गया था। लेकिन नीचे आपको स्पष्टीकरण पढ़ने के बाद, मैं थोड़ा और अधिक काम करता हूं कि यह कैसे काम करता है। – LG87

उत्तर

21

आपको एंड्रॉइड को अधिकृत/अधिकृत करने के लिए WebSecurityConfigurerAdapter की आवश्यकता है और उपयोगकर्ताओं को प्रमाणीकृत करने का एक तरीका प्रदान करने के लिए। एक स्प्रिंग बूट एप्लिकेशन आपके लिए ऐसा करेगा (HTTP मूल ऑथ के साथ अपना WebSecurityConfigurerAdapter जोड़कर)। यह डिफ़ॉल्ट रूप से ऑर्डर = 0 के साथ फ़िल्टर श्रृंखला बनाता है, और जब तक आप अनुरोध मैचर प्रदान नहीं करते हैं, तब तक सभी संसाधनों की सुरक्षा नहीं करता है। @EnableResourceServer कुछ समान करता है, लेकिन फ़िल्टर श्रृंखला जो इसे जोड़ती है वह डिफ़ॉल्ट रूप से क्रम = 3 पर होती है, इसलिए यह आपके WebSecurityConfigurerAdapter के क्रम में = 0 पर कैच-फ़ॉलबैक है। आपकी कॉन्फ़िगरेशन सेन दिखती है (लॉगिन श्रृंखला को प्राथमिकता मिलती है, लेकिन केवल अनुरोधों के एक छोटे से सेट से मेल खाता है)।

+2

मुझे इसे काम करने के लिए अपना WebSecurityConfigurerAdapter ऑर्डर = 2 बनाना था। –

+0

क्या आप ऑर्डर एनोटेशन के साथ ऑर्डर निर्दिष्ट करते हैं या आप इसे कहां निर्दिष्ट करते हैं? मेरे पास एक ही समस्या है और ऑर्डर के साथ कॉन्फ़िगरेशन को एनोटेट करने का कोई प्रभाव नहीं पड़ता है, संसाधन सर्वर सर्वर कॉन्फ़िगरर एडाप्टर एकमात्र वर्ग का उपयोग किया जा रहा है और WebSecurityConfigurerAdapter पूरी तरह से अनदेखा हो रहा है। – Cenobyte321

+1

@ Cenobyte321 'आदेश दिया गया आदेश 'या' @ ऑर्डर (1) 'या' @ ऑर्डर (2) ' – robinhowlett

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