2015-02-01 16 views
5

मैं एक वसंत बूट बाकी आधारित बैकएंड और एक बहुलक डार्ट आधारित दृश्यपटल के साथ एक छोटे एप्लिकेशन लिख रहा हूँ के माध्यम से प्रवेश के बाद sessionid प्राप्त करते हैं।वसंत सुरक्षा

वर्तमान में मैं लॉगिन तंत्र से सत्र id प्राप्त करने के लिए संघर्ष कर रहा हूँ ...

शुरू में मैं HeaderHttpSessionStrategy का उपयोग करें और क्षैतिज स्केलिंग सक्षम करने के लिए इस का उपयोग वसंत सत्र/redis सत्र दुकान के खिलाफ प्रमाणित करने के लिए करने की योजना बनाई ।

समस्या यह है कि वसंत सुरक्षा हमेशा लॉगिन के बाद रीडायरेक्ट करती है और HttpRequest कक्षा (एचटीएमएल पैकेज से) डार्ट में और रीडायरेक्ट के बाद प्रारंभिक प्रतिक्रिया से हेडर फ़ील्ड निश्चित रूप से मौजूद/सुलभ नहीं होती है। मैं ग्राहक के लिए followRedirect निष्क्रिय करने के लिए कोशिश की, लेकिन ऐसा लगता है कि इस आईओ पैकेज HttpRequest के लिए ही उपलब्ध है।

तब मैं CookieHttpSessionStrategy करने के लिए स्विच करने की कोशिश की लेकिन यह डार्ट HttpRequest तरह लग रहा है नहीं करता है ब्राउज़र कुकी बैकएंड में कुकीज़ प्राप्त की दुकान: -/

यह एक साधारण समस्या नहीं होनी चाहिए, लेकिन मैं एक छोटा सा खो रहा हूँ यहाँ। यह नहीं हो सकता कि हार्ड ...

मैं उदाहरण के लिए IntelliJ बाकी ग्राहक सब कुछ काम करता है का उपयोग करें और मैं या तो कुकी या हेडर फ़ील्ड से सत्र id निकाल सकते हैं जब ...

कोई भी विचार? : -/

+0

हुई एक चर्चा हाल ही में जो संबंधित हो सकती है https://groups.google.com/a/dartlang.org/forum/?nomobile= सच #! विषय/क्लाउड/OPFK_0MkB3c –

+0

मैंने इसे देखा, लेकिन ऐसा लगता है कि डार्ट का उपयोग होता है: io जो ब्राउज़र में उपलब्ध नहीं है :-( –

+0

ऐसा लगता है कि यह मेरा लॉगिन फ़िल्टर लिखना आसान है जो अभी रीडायरेक्ट नहीं करता है : - / –

उत्तर

2

ऐसा लगता है कि डार्ट हमेशा ब्राउज़र में इन पुन: निर्देशों का अनुसरण करता है और मैं कुकी या पहले अनुरोध के शीर्षक में टोकन प्राप्त करने के लिए कोई मौका है।

तो वैकल्पिक समाधान के रूप में मैं इस आगे क्या करने की कोशिश कर रहा हूँ:

: मैं एक संरक्षित संसाधन के रूप में कुछ इस तरह की है

@Configuration 
@EnableWebMvcSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests() 
       .antMatchers("/", "/logout").permitAll() 
       .anyRequest().authenticated() 
       .and() 
       .httpBasic() 
       .and() 
       .sessionManagement().sessionFixation().changeSessionId() 
       .and() 
       .csrf().disable(); 
    } 
... 
} 

एक नियंत्रक में: वसंत सुरक्षा में

सक्रिय मूल प्रमाणीकरण

@RequestMapping(value = "login", method = RequestMethod.POST) 
public String login() { 
    return RequestContextHolder.currentRequestAttributes().getSessionId(); 
} 

इस तरह आप नियमित रूप से परिणाम के रूप में अपने सत्र आईडी प्राप्त कर सकते हैं। इसलिए मैं प्रतिक्रिया बॉडी से आईडी प्राप्त कर सकता हूं और एक बार सही मूल लेख प्रमाण-पत्र प्रदान करने के बाद इसका उपयोग कर सकता हूं।

यह केवल यह बुरे लोगों साख या सत्र सूंघना लिए अधिक कठिन बना भरोसा enviromnents में या https के माध्यम से किया जाना चाहिए।

void login() { 
    Map<String, String> headers = {}; 
    authorize(headers); 
    HttpRequest.request(LOGIN_URL, method: "POST", requestHeaders: headers) 
    .then((request) => processLogin(request)) 
    .catchError((e) => processLoginError(e)); 

} 

void processLogin(HttpRequest request) { 
    sessionController.sessionId=request.responseText; 
    mainApp.showHome(); 
} 

void processLoginError(var e) { 
    print("total failure to login because of $e"); 
} 
String authorization() { 
    String auth = window.btoa("$username:$password"); 
    return "Basic $auth"; 
} 

void authorize(Map<String, String> headers) { 
    headers.putIfAbsent("Authorization",() => authorization()); 
} 

HeaderHttpSessionStrategy अनुरोध मैं यह कर सकता भेजने के लिए::

तो मूल रूप से इस मैं क्या लॉग इन करने में क्या है

void updateUserData(){ 
    _logger.info("Updating user data"); 
    Map<String, String> headers = {"Accept": "application/json", 'x-auth-token':sessionId}; 
    HttpRequest.request(USER_URL, method: "GET", requestHeaders: headers) 
    .then((request) => processUserData(request)) 
    .catchError(ErrorHandler.handleHttpErrorGeneric); 
} 

तुम भी, कुकीज़ के साथ काम करने के लिए यह हो सकता है लेकिन मुझे HttpRequest.request() पसंद है इसलिए हेडर फ़ील्ड के साथ जाना आसान था।

0

यह tutorial आप कैसे सफल या असफल प्रमाणीकरण के बाद पुनः निर्देशित से वसंत सुरक्षा को रोकने के लिए सिखाता है।

प्रमाणीकरण 200 के बजाय 301
विफल प्रमाणीकरण के लौटें लौटना चाहिए 401 के बजाय 302

वास्तव में, मुझे लगता है कि ट्यूटोरियल में कोड जटिल खत्म हो गया है चाहिए। MySavedRequestAwareAuthenticationSuccessHandler कक्षा के लिए, तुम सिर्फ onAuthenticationSuccess समारोह में एक लाइन की जरूरत है:

clearAuthenticationAttributes(request); 
संबंधित मुद्दे