2016-02-12 15 views
8

मेरे पास एक कोणीय 2 एप्लिकेशन है जिसमें मुझे प्रत्येक पृष्ठ पर प्रमाणित करने की आवश्यकता है। तो मैंने पुष्टि करने के लिए एक कस्टम राउटरऑलेट लागू किया है कि मैं प्रत्येक पृष्ठ परिवर्तन पर लॉग इन हूं। http://plnkr.co/edit/YnQv7Mh9Lxc0l0dgAo7B?p=previewकोणीय 2 बाल मार्गों के साथ प्रमाणीकरण

वहाँ मार्ग परिवर्तन रोकना और प्रवेश के लिए अनुप्रेषित जब उपयोगकर्ता प्रमाणीकृत नहीं है करने के लिए एक बेहतर तरीका है:

@Directive({ 
    selector: 'auth-outlet' 
}) 
export class AuthOutlet extends RouterOutlet { 
    publicRoutes: any; 
    private parentRouter: Router; 
    private authService: AuthService; 
    constructor(_elementRef: ElementRef, 
       _loader: DynamicComponentLoader, 
       _parentRouter: Router, 
       @Attribute('name') nameAttr: string, 
       _authService: AuthService) { 

     super(_elementRef, _loader, _parentRouter, nameAttr); 
     this.parentRouter = _parentRouter; 
     this.authService = _authService; 
     this.publicRoutes = { 
      'Login': true 
     }; 
    } 

    activate(oldInstruction: ComponentInstruction) { 
     var url = this.parentRouter.lastNavigationAttempt; 
     console.log('attemping to nav'); 
     if (!this.publicRoutes[url] && !this.authService.loggedIn){ 
      var newInstruction = new ComponentInstruction('Login', [], new RouteData(), Login, false, 1); 
      return super.activate(newInstruction); 
     } else { 
      return super.activate(oldInstruction); 
     } 
    } 
} 

यहाँ एक काम कर कोड है?

+1

शानदार जांचें !! आपको और क्या चाहिए !! – micronyks

+0

ठीक है, एक चीज के लिए आपको एक घटक निर्देश को नया नहीं करना चाहिए। तो यह पहले से ही समस्याएं हैं। इसके अलावा इसमें समस्याएं हैं यदि आप ऐसे बच्चे मार्ग में हैं जो लॉगिन मार्ग के बारे में नहीं जानते हैं। (मैंने पोस्टर के साथ इस मुद्दे पर काम किया) –

+0

यदि कोई पृष्ठ के गहरे लिंक से लिंक करता है, तो सर्वर शामिल हो जाता है और आप सर्वर पर ऑथ चेक करते हैं। अगर कोई अधिकृत है, तो वे आपके ऐप में आते हैं। एक बार आपके ऐप में, वे आसानी से आगे बढ़ सकते हैं। ब्राउजर और जेएस को यहां ऑथ चेक नहीं करना चाहिए, सर्वर को चाहिए। –

उत्तर

8

किसी को भी यह पता चलता है कि, अब कोणीय 2 में जवाब नए राउटर के हिस्से के रूप में "गार्ड" का उपयोग करना है।

https://angular.io/docs/ts/latest/guide/router.html#!#guards

एक बुनियादी गार्ड सिर्फ "CanActivate" लागू करता है इस प्रकार है, और काम कर सकता था: देखें कोणीय 2 प्रलेखन

import {Injectable} from "@angular/core"; 
import {CanActivate, Router} from "@angular/router"; 
import {AuthService} from "../services/auth.service"; 

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

    canActivate(){ 
     if(this.authService.isAuthenticated()) 
      return true; 

     this.router.navigate(["/login"]); 
     return false; 
    } 
} 

आप इस उदाहरण में देख सकते हैं मैं एक AuthService कहीं और चल रहा है (कार्यान्वयन महत्वपूर्ण नहीं है) जो उपयोगकर्ता को प्रमाणीकृत किया गया है, तो गार्ड को बता सकता है। यदि उनके पास है, तो सत्य वापस आएं और नेविगेशन सामान्य रूप से होता है। यदि वे नहीं हैं, तो हम झूठी वापसी करते हैं और उन्हें लॉगिन स्क्रीन पर रीडायरेक्ट करते हैं।

+0

हाय जॉन, एसओ में आपका स्वागत है और आपके उत्तर के लिए धन्यवाद। कोड केवल उत्तर ही निराश होते हैं क्योंकि लिंक समय के साथ बदल सकता है और अमान्य हो सकता है - इसलिए संदर्भ के रूप में लिंक के साथ, यहां एक पूर्ण उत्तर प्रदान करना बेहतर होता है। क्या आप इस बात को ध्यान में रखते हुए अपने जवाब को संपादित करना चाहते हैं? एक बार फिर धन्यवाद! –

+0

@ जोहानअकरमैन लेकिन ओपी के मुकाबले इस दृष्टिकोण का नुकसान यह है कि हमें इस रूट का उल्लेख सभी आवश्यक पथों के लिए करना है ताकि डुप्लिकेशंस और ओपी के कोड का उपयोग करके हम अंतिम प्रयास किए गए मार्ग को भी स्टोर कर सकें और फिर लॉगिन करने के बाद उपयोगकर्ता को रीडायरेक्ट करने के लिए उपयोग कर सकें। सफल है। – lbrahim

+0

@ इब्राहिम वास्तव में नहीं। यदि आपके पास साइट के पूरे अनुभाग (मॉड्यूल?) हैं जो गार्ड के पीछे होने की आवश्यकता है, तो आपको तदनुसार अपने मार्गों को ढांचा बनाना चाहिए। आपको केवल माता-पिता के स्तर पर गार्ड की आवश्यकता है। यदि आप बच्चों के साथ एक/व्यवस्थापक मार्ग परिभाषित करते हैं, तो केवल व्यवस्थापक मार्ग को गार्ड की आवश्यकता होती है और बच्चों को इसका वारिस होता है। –

0

आप CanActivate का भी उपयोग कर सकते हैं, हालांकि इस समय प्रत्यक्ष DI समर्थित नहीं है। यहां एक अच्छा workaround था।

शुभकामनाएं।

2

यहां कोणीय 2 आरसी 6 के साथ ऑथगार्ड का उपयोग करने का एक अद्यतन उदाहरण है।

घर मार्ग के साथ मार्गों AuthGuard द्वारा संरक्षित

import { Routes, RouterModule } from '@angular/router'; 

import { LoginComponent } from './login/index'; 
import { HomeComponent } from './home/index'; 
import { AuthGuard } from './_guards/index'; 

const appRoutes: Routes = [ 
    { path: 'login', component: LoginComponent }, 

    // home route protected by auth guard 
    { path: '', component: HomeComponent, canActivate: [AuthGuard] }, 

    // otherwise redirect to home 
    { path: '**', redirectTo: '' } 
]; 

export const routing = RouterModule.forRoot(appRoutes); 

AuthGuard प्रवेश पृष्ठ पर यदि उपयोगकर्ता

import { Injectable } from '@angular/core'; 
import { Router, CanActivate } from '@angular/router'; 

@Injectable() 
export class AuthGuard implements CanActivate { 

    constructor(private router: Router) { } 

    canActivate() { 
     if (localStorage.getItem('currentUser')) { 
      // logged in so return true 
      return true; 
     } 

     // not logged in so redirect to login page 
     this.router.navigate(['/login']); 
     return false; 
    } 
} 

प्रवेश न होने पर पूर्ण उदाहरण के लिए और काम डेमो आप कर सकते हैं पुनर्निर्देश this post

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