5

मैं वर्तमान में बैकएंड के रूप में वसंत बूट के साथ एक कोणीय 2 उदाहरण अनुप्रयोग लागू कर रहा हूं। मुझे फ्रंटेंड ऑथ गार्ड मैकेनिज्म और अवलोकन के साथ कुछ समस्याएं आ रही हैं।http अनुरोध और अवलोकन के साथ Angular2 auth guard

मैं प्राप्त करने के लिए कोशिश कर रहा हूँ:

  1. जब किसी एक संरक्षित मार्ग एक उपयोगकर्ता पहले से ही प्रमाणन सेवा चर
  2. अगर यह तो सेट नहीं है में सेट है, तो प्रमाणन गार्ड की जाँच करनी चाहिए में प्रवेश करती है एक http यह अनुरोध करने के लिए अनुरोध जारी किया जाना चाहिए कि कोई सत्र उपलब्ध है या नहीं
  3. सेवा विधि को एक वास्तविक/गलत मान (संभावित http अनुरोध के रूप में असीमित रूप से) वापस करना चाहिए
  4. यदि सेवा झूठी आती है तो लेखक को लॉगिन पृष्ठ पर रीडायरेक्ट करना चाहिए
  5. प्रमाणन गार्ड सही/गलत तो मार्ग लौटना चाहिए या सक्रिय किया जा सकता है या तो नहीं

मेरे कोड वर्तमान में (मैं btw RC5 उपयोग कर रहा हूँ।) इस तरह दिखता है:

प्रमाणीकरण गार्ड

import {Injectable} from "@angular/core"; 
import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from "@angular/router"; 
import {Observable, Subject} from "rxjs/Rx"; 
import {AuthService} from "./auth.service"; 

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private authService: AuthService, private router: Router) {} 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean { 
    var authenticated = this.authService.isAuthenticated(); 
    var subject = new Subject<boolean>(); 
    authenticated.subscribe(
     (res) => { 
      console.log("onNext guard: "+res); 
      if(!res && state.url !== '/signin') { 
      console.log("redirecting to signin") 
      this.router.navigate(['/signin']); 
      } 
      subject.next(res); 
     }); 
    return subject.asObservable(); 
    } 
} 

प्रमाणीकरण सेवा

import {Injectable} from "@angular/core"; 
import {User} from "./user.interface"; 
import {Router} from "@angular/router"; 
import {Http, Response, Headers} from "@angular/http"; 
import {environment} from "../environments/environment"; 
import {Observable, Observer, Subject} from "rxjs/Rx"; 

@Injectable() 
export class AuthService { 
    private authenticatedUser : User; 
    constructor(private router: Router, private http: Http) {} 

    signupUser(user: User) { 
    } 


    logout() { 
    //do logout stuff 
    this.router.navigate(['/signin']); 
    } 

    isAuthenticated() : Observable<boolean> { 
    var subject = new Subject<boolean>(); 
    if (this.authenticatedUser) { 
     subject.next(true); 
    } else { 
     this.http.get(environment.baseUrl + '/user') 
     .map((res : Response) => res.json()) 
     .subscribe(res => { 
      console.log("next: returning true"); 
      this.authenticatedUser = User.ofJson(res); 
      subject.next(true); 
     }, (res) => { 
      console.log("next: returning false"); 
      subject.next(false); 
     }); 
    } 
    return subject.asObservable(); 
    } 
} 

समस्या है: गार्ड राउटर घटक को सक्रिय करने की अनुमति नहीं देता है, भले ही मैं लॉग इन हूं।

सहायता के लिए धन्यवाद!

+0

समस्या क्या है? –

+0

संपादित देखें, राउटर घटक कभी भी सक्रिय नहीं होता है, भले ही मैंने सफलतापूर्वक लॉग इन किया हो। अगर मैं किसी भी वेलेबल्स का उपयोग नहीं करता तो यह ठीक काम करता है, लेकिन मैं http अनुरोधों का उपयोग नहीं कर सकता, इसलिए यह मेरे लिए एक विकल्प नहीं है। – Tim

उत्तर

7

बदलें

return subject.asObservable(); 

return subject.asObservable().first(); 

रूटर पूरा करने के लिए नमूदार के लिए इंतजार कर रहा है। first() इसे पहली घटना के बाद पूरा करता है।

+0

धन्यवाद यह समस्या का एक हिस्सा हल करता है। अब क्या होता है कि जब मैं संरक्षित मार्ग पर क्लिक करता हूं तो यह हमेशा मार्ग को सक्रिय करने और लॉग संदेश प्रिंट करने से रोकता है। लेकिन जब मैं लॉगिन स्क्रीन में वैध ऑथ क्रेडेंशियल्स दर्ज करता हूं और सर्वर 200 ओके के साथ जवाब देता है, तो भी मैं सुरक्षित मार्ग तक नहीं पहुंच सकता। जब मैं f5 दबाता हूं और पृष्ठ को रीफ्रेश करता हूं तो अचानक मैं सुरक्षित मार्ग तक पहुंच सकता हूं। यह शायद सेवा वर्ग में प्रमाणीकृत यूज़र चर के कारण है जहां मैं उपयोगकर्ता ऑब्जेक्ट को संग्रहीत करता हूं, लेकिन मुझे यकीन नहीं है कि क्यों, कोई विचार? – Tim

+1

आप 'प्रमाणीकृत()' में 'विषय' के बजाय 'व्यवहार विषय' का उपयोग करने का प्रयास कर सकते हैं। वर्तमान में यदि 'this.authenticatedUser' सत्य है तो आप 'सत्य' उत्सर्जित करते हैं लेकिन इस बिंदु पर अभी तक कोई ग्राहक नहीं है। इस कोड भाग को सिंक निष्पादित किया जाता है और 'true' 'वापसी विषय से पहले उत्सर्जित होता है। ऑब्सर्वेबल()' निष्पादित किया जाता है और 'प्रमाणीकृत()' के कॉलर को यह ईवेंट प्राप्त नहीं होगा। –

+2

मुझे BehavorSubject (सेवा) और ReplaySubject (गार्ड) के संयोजन का उपयोग करना पड़ा, लेकिन यह अब अपेक्षित के रूप में काम कर रहा है। धन्यवाद! – Tim

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