2016-01-12 10 views
9

मैं वास्तव में पिछले कुछ दिनों से उच्च और निम्न खोज रहा हूं कि यह कैसे करें और आखिर में हार मानने और सहायता मांगने का फैसला किया है, कृपया !!!स्प्रिंग सत्र/रेडिस प्रमाणीकरण और रूट के साथ स्प्रिंग ज़ुउल एपीआई गेटवे उसी अनुरोध में

मैं एक API प्रवेश द्वार के रूप कोणीय और स्प्रिंग सुरक्षा विशेष रूप से Zuul प्रॉक्सी पर डॉ डेव Syer के ट्यूटोरियल का पालन किया और Redis के साथ वसंत सत्र का उपयोग कर (https://github.com/spring-guides/tut-spring-security-and-angular-js/tree/master/double#_sso_with_oauth2_angular_js_and_spring_security_part_v)

मुद्दा मैं कर रहा हूँ कि मैं संसाधन बाकी सेवाओं बोल रहा हूँ है निम्नलिखित हेडर के साथ एक बाहरी अनुप्रयोग से प्रवेश द्वार के माध्यम से:

String plainCreds = "user:password"; 
byte[] plainCredsBytes = plainCreds.getBytes(); 
byte[] base64CredsBytes = Base64.getEncoder().encode(plainCredsBytes); 
String base64Creds = new String(base64CredsBytes); 

HttpHeaders headers = new HttpHeaders(); 
headers.add("Authorization", "Basic " + base64Creds); 

प्रमाणीकृत करने और फिर redis द्वारा प्रमाणीकृत सत्र का उपयोग करने की zuul और फिर संसाधन द्वारा कराई।

मुद्दा यह है कि सत्र अनुरोध के जवाब के बाद गेटवे में केवल लाल रंग के लिए प्रतिबद्ध है। तो क्या हो रहा है कि जब मैं हेडर के साथ संसाधन सेवा कहता हूं, तो मैं गेटवे और सत्र में होने वाले सफल प्रमाणीकरण को देख सकता हूं, हालांकि सत्र के कारण मुझे संसाधन में 403 मिल रहा है क्योंकि इसके बाद लाल रंग में नहीं है zuul के माध्यम से मार्गित किया गया है।

हालांकि अगर मुझे त्रुटि मिलती है, तो सत्र आईडी को पकड़ें और इसे शीर्षलेख में जोड़ें और फिर से प्रयास करें यह काम करता है क्योंकि अब मेरा प्रमाणित सत्र संसाधन प्रोजेक्ट के लिए रूट प्रोजेक्ट के लिए उपलब्ध है।

कृपया कोई मुझे निर्देश दे सकता है कि मैं गेटवे के माध्यम से अपनी कॉल को प्रमाणित करने और उसी अनुरोध में रूट करने के तरीके के बारे में बता सकता हूं?

धन्यवाद जस्टिन

+0

क्या आपने इसे हल किया? मैं एक ही समस्या के साथ हूँ। –

उत्तर

9

मैंने जस्टिन टेलर के विभिन्न पृष्ठों पर पोस्ट का पालन किया, तो यह उनका समाधान है। - के बाद से वसंत सत्र v1.0 वहाँ एनोटेशन संपत्ति @EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE) जो तुरंत Redis में सत्र डेटा बचाता है

  1. वसंत सत्र बेसब्री से प्रतिबद्ध बनाओ: यह मुझे यहाँ स्रोत कोड के साथ समाधान के लिए समझ में आता है। दस्तावेज़ीकरण here
  2. वर्तमान अनुरोध के हेडर में सत्र जोड़ने के लिए आसान Zuul फिल्टर:
@Component 
public class SessionSavingZuulPreFilter extends ZuulFilter { 

    @Autowired 
    private SessionRepository repository; 

    @Override 
    public String filterType() { 
     return "pre"; 
    } 

    @Override 
    public int filterOrder() { 
     return 0; 
    } 

    @Override 
    public Object run() { 
     RequestContext context = RequestContext.getCurrentContext(); 

     HttpSession httpSession = context.getRequest().getSession(); 
     Session session = repository.getSession(httpSession.getId()); 

     context.addZuulRequestHeader("Cookie", "SESSION=" + httpSession.getId()); 

     log.info("ZuulPreFilter session proxy: {}", session.getId()); 

     return null; 
    } 

} 

एक बार फिर - यह मेरा समाधान नहीं है - साख जस्टिन टेलर के पास जाओ।

+0

कूल दबाया यह सहायक था! मुझे आशा है कि भविष्य में ज़ुउल और वसंत सत्र के साथ बेहतर एकीकरण होगा जो इसे स्टेटलेस एपिस के साथ किनारे आर्किटेक्चर/गेटवे के लिए एक सुंदर मानक उपयोग केस के रूप में पूरा करेगा। –

+0

उन पर ठोकर खा रहे लोगों के लिए। यह फ़िल्टर मूल रूप से बॉक्स से बाहर काम करता है। 'अन्य विधियों' के लिए, टाइप को "प्री" और शून्य पर ऑर्डर करें। निश्चित नहीं है कि क्यों छोड़े गए हैं क्योंकि वे अनिवार्य रूप से एक पंक्ति हैं जो इस कोड को प्रतिलिपि बनाते हैं और पेस्ट करते हैं। – Ceekay

+1

@Ceekay आपकी टिप्पणी के लिए धन्यवाद। मैंने कोड तय किया। यह कोड सिर्फ एक उदाहरण होने के लिए था। जैसे यह एकाधिक कुकी मानों को संभाल नहीं करता है (यह SESSION = के साथ सभी मौजूदा मानों को ओवरराइड करता है)। – shobull

3

मैं देरी प्रतिक्रिया के बारे में यहाँ तो माफी चाहता हूँ, दक्षिण अफ्रीका के बारे में महान चीजों में से एक हमारे महान टेलीकॉम hehe, मैं थोड़ी देर के लिए घर में कोई इंटरनेट के लिए अपने स्रोत कोड था और किया है यह मेरे घर पीसी पर है।

हाँ स्टीव सही रास्ते पर है।

  1. वसंत सत्र केवल प्रारंभिक भेजे अनुरोध के जवाब पर Redis के लिए प्रमाणीकृत सत्र करता है: वहाँ दो मुद्दों है कि आप यहाँ हल करने की आवश्यकता है। तो पहला कदम उस लिंक स्टीव का पालन करना है ताकि यह सुनिश्चित किया जा सके कि जब भी सत्र बदलता है तो वसंत सत्र फिर से लाल हो जाता है।

  2. जुउल प्रारंभिक रूटिंग पर इस नए प्रमाणीकृत सत्र का प्रचार नहीं करता है। तो आपको ज़ूउल प्री फ़िल्टर (आसपास के कई उदाहरण) का उपयोग करने की आवश्यकता है जो प्रमाणित सत्र आईडी प्राप्त करता है और फिर इसे गेटवे के पीछे संसाधन के लिए zuul अनुरोध में जोड़ता है। आप सत्र आईडी सेट करने के लिए zuul अनुरोध पर एक सेटर विधि देखेंगे।

आप ऐसा नहीं करते हैं, तो आप दो कॉल करने के लिए, एक अपने प्रमाणीकृत सत्र के साथ बाद में कॉल प्रमाणित करने और एक वैध सत्र id जो वसंत सत्र से redis में होगा प्राप्त करने के लिए, और उसके बाद की आवश्यकता होगी आईडी।

मैंने थोड़ी देर के लिए इसके साथ लड़ाई की, लेकिन जब मैं इसे काम कर रहा था तो यह जगह पर था। मैंने इस समाधान को केवल http मूल के लिए काम करने के लिए बढ़ाया, लेकिन एक jwt टोकन कार्यान्वयन में जोड़ा गया।

उम्मीद है कि यह मदद करता है, जैसे ही मैं घर से जुड़ा हूं, मैं स्रोत पोस्ट कर सकता हूं।

शुभकामनाएं! जस्टिन

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