লগইন পৃষ্ঠায় কৌণিক পুনর্নির্দেশ


122

আমি Asp.Net MVC বিশ্ব থেকে এসেছি যেখানে ব্যবহারকারীরা অনুমোদিত নয় এমন কোনও পৃষ্ঠায় অ্যাক্সেস করার চেষ্টা করছেন তারা স্বয়ংক্রিয়ভাবে লগইন পৃষ্ঠায় পুনঃনির্দেশিত হয়।

আমি কৌণিকের উপর এই আচরণটি পুনরুত্পাদন করার চেষ্টা করছি। আমি @ ক্যানএ্যাকটিভেট ডেকোরেটরটি পেরিয়ে এসেছি, তবে এটির ফলাফলটি উপাদানটি মোটেও রেন্ডারিং নয়, কোনও পুনর্নির্দেশ নয়।

আমার প্রশ্নটি নিম্নলিখিত:

  • কৌণিক কি এই আচরণ অর্জনের জন্য কোনও উপায় সরবরাহ করে?
  • যদি তাই হয়, কিভাবে? এটি কি একটি ভাল অনুশীলন?
  • যদি তা না হয় তবে কৌণিক ব্যবহারকারীর অনুমোদনের জন্য সেরা অনুশীলনটি কী হবে?

আমি একটি প্রকৃত নির্দেশ জুড়েছি যা দেখায় যদি যত্নশীল হন তবে লেখক সামগ্রী কীভাবে করবেন তা দেখায়।
মাইকেল অরিল

এই উত্তরটি may দরকারী: stackoverflow.com/a/59008239/7059557
AmirReza-Farahlagha

উত্তর:


86

আপডেট: আমি গিথুবের উপর OAuth2 ইন্টিগ্রেশন সহ একটি পূর্ণ কঙ্কাল কৌণিক 2 প্রকল্প প্রকাশ করেছি যা নীচে উল্লিখিত নির্দেশকে কর্মে দেখায়।

এটি করার একটি উপায় হ'ল এটি ব্যবহারের মাধ্যমে directive। অ্যাঙ্গুলার 2 এর বিপরীতে components, যা মূলত নতুন HTML ট্যাগ (যুক্ত কোড সহ) আপনি নিজের পৃষ্ঠায় সন্নিবেশ করান, একটি গুণবাচক নির্দেশনা এমন একটি বৈশিষ্ট্য যা আপনি একটি ট্যাগে রেখেছিলেন যা কিছু আচরণ ঘটায়। এখানে ডক্স

আপনার কাস্টম বৈশিষ্ট্যের উপস্থিতি আপনাকে সেই নির্দেশক উপাদানটি (বা এইচটিএমএল উপাদান) দিয়েছিল যা আপনি নির্দেশকে রেখেছিলেন my আমার বর্তমান অ্যাঙ্গুলার 2 / ওআউথ 2 অ্যাপ্লিকেশনের জন্য আমি যে নির্দেশনা ব্যবহার করি তা বিবেচনা করুন:

import {Directive, OnDestroy} from 'angular2/core';
import {AuthService} from '../services/auth.service';
import {ROUTER_DIRECTIVES, Router, Location} from "angular2/router";

@Directive({
    selector: '[protected]'
})
export class ProtectedDirective implements OnDestroy {
    private sub:any = null;

    constructor(private authService:AuthService, private router:Router, private location:Location) {
        if (!authService.isAuthenticated()) {
            this.location.replaceState('/'); // clears browser history so they can't navigate with back button
            this.router.navigate(['PublicPage']);
        }

        this.sub = this.authService.subscribe((val) => {
            if (!val.authenticated) {
                this.location.replaceState('/'); // clears browser history so they can't navigate with back button
                this.router.navigate(['LoggedoutPage']); // tells them they've been logged out (somehow)
            }
        });
    }

    ngOnDestroy() {
        if (this.sub != null) {
            this.sub.unsubscribe();
        }
    }
}

ব্যবহারকারী ইতিমধ্যে লগ ইন হয়েছে কিনা তা নির্ধারণ করতে আমি এটি লিখেছিলাম এমন একটি প্রমাণীকরণ পরিষেবাটি ব্যবহার করে এবং প্রমাণীকরণ ইভেন্টটিতে সাবস্ক্রাইব করে যাতে এটি কোনও ব্যবহারকারীকে লগ আউট করে বা আউট আউট হলে লিক আউট করতে পারে।

আপনি একই জিনিস করতে পারে। আপনি আমার মতো একটি নির্দেশিকা তৈরি করতে চান যা প্রয়োজনীয় কুকি বা অন্যান্য রাষ্ট্রের তথ্যের উপস্থিতি যাচাই করে যে ব্যবহারকারী প্রমাণীকরণ করেছে। যদি আপনি যে পতাকাগুলি সন্ধান করছেন তাদের যদি না থাকে তবে ব্যবহারকারীকে আপনার প্রধান পাবলিক পৃষ্ঠাতে (যেমন আমি করি) বা আপনার OAuth2 সার্ভারে (বা যাই হোক না কেন) পুনর্নির্দেশ করুন। আপনি সুরক্ষিত করা প্রয়োজন যে কোনও উপাদান উপর যে নির্দেশাবলী গুণাবলী লাগাতে হবে। এই ক্ষেত্রে, এটি protectedউপরে যেভাবে আমি আটকানো হয়েছিল তার মতো বলা যেতে পারে ।

<members-only-info [protected]></members-only-info>

তারপরে আপনি আপনার অ্যাপ্লিকেশনটিতে লগইন দৃশ্যে ব্যবহারকারীকে নেভিগেট / পুনর্নির্দেশ করতে এবং সেখানে প্রমাণীকরণটি পরিচালনা করতে চান। আপনি যেটি করতে চেয়েছিলেন তার বর্তমান রুটটি আপনাকে পরিবর্তন করতে হবে। সুতরাং সেক্ষেত্রে আপনি আপনার নির্দেশিকার ফাংশনে রাউটার অবজেক্ট পাওয়ার জন্য নির্ভরতা ইনজেকশনটি ব্যবহার করবেন constructor()এবং তারপরে navigate()ব্যবহারকারীকে আপনার লগইন পৃষ্ঠায় প্রেরণ করার পদ্ধতিটি ব্যবহার করুন (উপরে আমার উদাহরণ হিসাবে)।

এটি ধরে নেওয়া হয়েছে যে আপনার কোথাও <router-outlet>এমন কোনও ট্যাগকে নিয়ন্ত্রণ করে কোথাও একাধিক রুটের সিরিজ রয়েছে যা সম্ভবত:

@RouteConfig([
    {path: '/loggedout', name: 'LoggedoutPage', component: LoggedoutPageComponent, useAsDefault: true},
    {path: '/public', name: 'PublicPage', component: PublicPageComponent},
    {path: '/protected', name: 'ProtectedPage', component: ProtectedPageComponent}
])

পরিবর্তে, আপনার যদি কোনও বাহ্যিক ইউআরএল যেমন আপনার OAuth2 সার্ভারে ব্যবহারকারীকে পুনর্নির্দেশের প্রয়োজন হয় , তবে আপনার নির্দেশিকা নীচের মতো কিছু করতে হবে:

window.location.href="https://myserver.com/oauth2/authorize?redirect_uri=http://myAppServer.com/myAngular2App/callback&response_type=code&client_id=clientId&scope=my_scope

4
এটি কাজ করে! ধন্যবাদ! আমি এখানে অন্য একটি পদ্ধতিও পেয়েছি - github.com/auth0/angular2-authentication-sample/blob/master/src/… আমি কোন পদ্ধতিটি আরও ভাল তা বলতে পারি না, তবে সম্ভবত কেউ এটির জন্য দরকারীও বোধ করতে পারে।
সের্গেই

3
ধন্যবাদ ! আমি পরামিতি / সুরক্ষিত /: রিটার্ন ইউআরএল যুক্ত একটি নতুন রুট যুক্ত করেছি, নির্দেশের এনজিওএনইনেটে আটকে থাকা লোকেশন.পথ () হ'ল রিটার্নআরল। এটি মূলত অনুরোধিত ইউআরএল-এ লগইন করার পরে ব্যবহারকারীর নেভিগেট করতে দেয়।
অ্যামৌরি

1
একটি সহজ সমাধানের জন্য নীচের উত্তরগুলি দেখুন। এই সাধারণ যে কোনও কিছু (সত্যায়িত না হলে পুনঃনির্দেশ করা) এর একটি বাক্য উত্তরের একটি সহজ সমাধান থাকা উচিত।
রিক ও'শিয়া

7
দ্রষ্টব্য: এই উত্তরটি অ্যাঙ্গুলার 2 এর বিটা বা রিলিজ-প্রার্থী সংস্করণটিকে সম্বোধন করে এবং Angular 2 ফাইনালের জন্য আর প্রযোজ্য নয়।
jbandi


116

এখানে কৌনিক 4 ব্যবহার করে একটি আপডেট হওয়া উদাহরণ রয়েছে (কৌণিক 5 - 8 এর সাথেও সামঞ্জস্যপূর্ণ)

হোম রুট সহ রুটগুলি অ্যাথগুয়ার্ড দ্বারা সুরক্ষিত

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);

ব্যবহারকারী লগ ইন না হলে অথগুয়ার্ড লগইন পৃষ্ঠাতে পুনর্নির্দেশ করে

লগইন পৃষ্ঠায় ক্যোয়ারী প্যারামে মূল url পাস করার জন্য আপডেট করা হয়েছে Updated

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

@Injectable()
export class AuthGuard implements CanActivate {

    constructor(private router: Router) { }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        if (localStorage.getItem('currentUser')) {
            // logged in so return true
            return true;
        }

        // not logged in so redirect to login page with the return url
        this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
        return false;
    }
}

পুরো উদাহরণ এবং ওয়ার্কিং ডেমো জন্য আপনি এই পোস্টটি চেক করতে পারেন


6
আমি প্রশ্ন একটি ফলো আছে, এর একটি অবাধ মূল্য জন্য উপলব্ধ সেটিং যদি না হয় currentUserlocalStorageএখনও সুরক্ষিত রুট অ্যাক্সেস করতে সক্ষম হবে? যেমন। localStorage.setItem('currentUser', 'dddddd')?
jsd

2
এটি ক্লায়েন্ট-পক্ষের সুরক্ষা বাইপাস করবে। তবে এটি সার্ভার-সাইড লেনদেনের জন্য প্রয়োজনীয় টোকেনটিও পরিষ্কার করে দেবে, সুতরাং অ্যাপ্লিকেশন থেকে কোনও দরকারী ডেটা বের করা যায়নি।
ম্যাট মেনগ

55

চূড়ান্ত রাউটার ব্যবহার

নতুন রাউটারের প্রবর্তনের সাথে সাথে রুটগুলি রক্ষা করা আরও সহজ হয়ে গেছে। আপনাকে অবশ্যই একজন গার্ডকে সংজ্ঞায়িত করতে হবে, যা একটি পরিষেবা হিসাবে কাজ করে এবং এটিকে রুটে যুক্ত করতে হবে।

import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { UserService } from '../../auth';

@Injectable()
export class LoggedInGuard implements CanActivate {
  constructor(user: UserService) {
    this._user = user;
  }

  canActivate() {
    return this._user.isLoggedIn();
  }
}

এখন LoggedInGuardরুটে পাস করুন এবং এটি providersমডিউলটির অ্যারেতে যুক্ত করুন ।

import { LoginComponent } from './components/login.component';
import { HomeComponent } from './components/home.component';
import { LoggedInGuard } from './guards/loggedin.guard';

const routes = [
    { path: '', component: HomeComponent, canActivate: [LoggedInGuard] },
    { path: 'login', component: LoginComponent },
];

মডিউল ঘোষণা:

@NgModule({
  declarations: [AppComponent, HomeComponent, LoginComponent]
  imports: [HttpModule, BrowserModule, RouterModule.forRoot(routes)],
  providers: [UserService, LoggedInGuard],
  bootstrap: [AppComponent]
})
class AppModule {}

এটি চূড়ান্ত প্রকাশের সাথে কীভাবে কাজ করে সে সম্পর্কে বিস্তারিত ব্লগ পোস্ট: https://medium.com/@blacksonic86/angular-2-authentication-revisited-611bf7373bf9

অবহেলিত রাউটারের ব্যবহার

আরও লম্বা সমাধান হ'ল প্রসারিত করা RouterOutletএবং কোনও রুট সক্রিয়করণের সময় ব্যবহারকারী লগ ইন হয়েছে কিনা তা এইভাবে আপনাকে প্রতিটি উপাদানগুলিতে আপনার নির্দেশিকা অনুলিপি করতে এবং আটকাতে হবে না। উপ-কম্পোনেন্টের ভিত্তিতে প্লাস পুনঃনির্দেশ বিভ্রান্তিকর হতে পারে।

@Directive({
  selector: 'router-outlet'
})
export class LoggedInRouterOutlet extends RouterOutlet {
  publicRoutes: Array;
  private parentRouter: Router;
  private userService: UserService;

  constructor(
    _elementRef: ElementRef, _loader: DynamicComponentLoader,
    _parentRouter: Router, @Attribute('name') nameAttr: string,
    userService: UserService
  ) {
    super(_elementRef, _loader, _parentRouter, nameAttr);

    this.parentRouter = _parentRouter;
    this.userService = userService;
    this.publicRoutes = [
      '', 'login', 'signup'
    ];
  }

  activate(instruction: ComponentInstruction) {
    if (this._canActivate(instruction.urlPath)) {
      return super.activate(instruction);
    }

    this.parentRouter.navigate(['Login']);
  }

  _canActivate(url) {
    return this.publicRoutes.indexOf(url) !== -1 || this.userService.isLoggedIn()
  }
}

UserServiceআপনার ব্যবসা যেখানে লজিক থাকা ব্যবহারকারী বা না লগ করা হয় কিনা জায়গা ঘোরা। আপনি এটি কনস্ট্রাক্টরে ডিআই দিয়ে সহজেই যুক্ত করতে পারেন।

যখন ব্যবহারকারী আপনার ওয়েবসাইটে কোনও নতুন url তে নেভিগেট করে, সক্রিয় পদ্ধতিটি বর্তমান নির্দেশাবলীর সাথে কল করা হয়। এটি থেকে আপনি ইউআরএল ধরে নিতে পারবেন এবং এটি অনুমোদিত কিনা তা স্থির করতে পারেন। লগইন পৃষ্ঠায় পুনর্নির্দেশ না হলে।

এটি শেষ করার জন্য একটি শেষ জিনিসটি রয়ে গেছে, এটি একটির মধ্যে অন্তর্নির্মিত পরিবর্তে এটি আমাদের মূল উপাদানটিতে পৌঁছে দেওয়া।

@Component({
  selector: 'app',
  directives: [LoggedInRouterOutlet],
  template: template
})
@RouteConfig(...)
export class AppComponent { }

এই @CanActiveদ্রবণটি লাইফসাইকেল ডিকোয়টারের সাথে ব্যবহার করা যাবে না , কারণ যদি এতে ফাংশনটি পাস হয়ে যায় তবে এটি মিথ্যা সমাধান করে, অ্যাক্টিভেট পদ্ধতিটি কল করা RouterOutletহবে না।

এটি সম্পর্কে একটি বিস্তারিত ব্লগ পোস্টও লিখেছিল: https://medium.com/@blacksonic86/authentication-in-angular-2-958052c64492


2
এছাড়াও এটি সম্পর্কে আরও বিস্তারিত ব্লগ পোস্ট লিখেছেন
माध्यम.

হ্যালো @ ব্ল্যাকসোনিক। সবে এনজি 2 তে খনন শুরু হয়েছে। আমি আপনার পরামর্শটি অনুসরণ করেছি তবে গল্প-স্লিন্টের সময় এই ত্রুটিটি পেয়ে শেষ করেছি: Failed to lint <classname>.router-outlet.ts[15,28]. In the constructor of class "LoggedInRouterOutlet", the parameter "nameAttr" uses the @Attribute decorator, which is considered as a bad practice. Please, consider construction of type "@Input() nameAttr: string". এই বার্তাটি থেকে মুক্তি পাওয়ার জন্য কনস্ট্রাক্টর ("_pareRounter") কী পরিবর্তন করবেন তা অনুধাবন করতে পারিনি। কোন চিন্তা?
লেভরফ

ঘোষণাটি বর্ধিত শ্রেণীর মতো একই স্বাক্ষরের জন্য অবজেক্ট রাউটারআউটলেটে অন্তর্নিহিত অন্তর্নিহিত থেকে অনুলিপি করা হয়েছে, আমি এই লাইনের জন্য নির্দিষ্ট স্লিন্ট নিয়মটি অক্ষম করব
ব্ল্যাকসোনিক

আমি মজেচেভ স্টাইল- গাইডে একটি রেফারেন্স পেয়েছি ("@ অ্যাগ্রিবিউট প্যারামিটার ডিকোরিটারের চেয়ে ইনপুটগুলি পছন্দ করুন")। লাইনটি এতে পরিবর্তন করা হয়েছে _parentRouter: Router, @Input() nameAttr: string,এবং tslint আর ত্রুটি উত্থাপন করে না। কৌণিক মূল থেকে "ইনপুট" এ "অ্যাট্রিবিউট" আমদানিও প্রতিস্থাপন করে। আশাকরি এটা সাহায্য করবে.
লেভরফ

1
২.০.০-আরসি .১ নিয়ে সমস্যা আছে কারণ রাউটারআউটলেট রফতানি করা হয়নি এবং এর প্রসারিত হওয়ার কোনও সম্ভাবনা নেই
mkuligowski

53

দয়া করে, রাউটার আউটলেটকে ওভাররাইড করবেন না! এটি সর্বশেষতম রাউটার রিলিজ (3.0 বিটা) সহ একটি দুঃস্বপ্ন।

পরিবর্তে ইন্টারফেসগুলি ক্যানএ্যাকটিভেট এবং ক্যানডিয়েটিভেট ব্যবহার করুন এবং আপনার রুট সংজ্ঞাতে ক্লাসটি ক্যানএ্যাকটিভেট / ক্যানডিয়েটিভেট হিসাবে সেট করুন।

সে রকমই:

{ path: '', component: Component, canActivate: [AuthGuard] },

ক্লাস:

@Injectable()
export class AuthGuard implements CanActivate {

    constructor(protected router: Router, protected authService: AuthService)
    {

    }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {

        if (state.url !== '/login' && !this.authService.isAuthenticated()) {
            this.router.navigate(['/login']);
            return false;
        }

        return true;
    }
}

আরও দেখুন: https://angular.io/docs/ts/latest/guide/router.html#!# স্ক্যান- অ্যাক্টিভেট- গার্ড


2
খুব সুন্দর, @ ব্ল্যাকসোনিকের উত্তরটি অবহেলিত রাউটারের সাথে আমার জন্য নিখুঁতভাবে কাজ করছে। নতুন রাউটারে আপগ্রেড করার পরে আমাকে অনেক রিফ্যাক্টর করতে হয়েছিল। আপনার সমাধান ঠিক আমার যা প্রয়োজন!
ইভানডেনজেন

আমি আমার অ্যাপ.কম অংশে কাজ করতে পারি না c প্রমাণীকরণ না হলে আমি ব্যবহারকারীকে পুনর্নির্দেশের দিকে লক্ষ্য করছি। এটি আমার কাছে থাকা রাউটারের সংস্করণ (যদি আমার এটি আপডেট করার দরকার হয় তবে আমি গিট ব্যাশ কমান্ড লাইন ব্যবহার করে কীভাবে এটি করব?) আমার কাছে সংস্করণটি রয়েছে: "@ কৌণিক / রাউটার": "2.0.0-rc.1"
AngularM

আমি কি অন্য উপাদান রুটকে সুরক্ষিত করতে একই শ্রেণি (অথগুয়ার্ড) ব্যবহার করতে পারি?
tsiro

4

উপরের দুর্দান্ত উত্তরগুলি অনুসরণ করে আমি এগুলিও করতে চাই CanActivateChild: শিশুদের রুট রক্ষা করা। এটি guardএসিএল-এর মতো মামলার জন্য শিশুদের সহায়ক পথে যোগ করতে ব্যবহৃত হতে পারে

এটা এইভাবেই চলে

src / app / auth-guard.service.ts (সংক্ষিপ্তসার)

import { Injectable }       from '@angular/core';
import {
  CanActivate, Router,
  ActivatedRouteSnapshot,
  RouterStateSnapshot,
  CanActivateChild
}                           from '@angular/router';
import { AuthService }      from './auth.service';

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

  canActivate(route: ActivatedRouteSnapshot, state:    RouterStateSnapshot): boolean {
    let url: string = state.url;
    return this.checkLogin(url);
  }

  canActivateChild(route: ActivatedRouteSnapshot, state:  RouterStateSnapshot): boolean {
    return this.canActivate(route, state);
  }

/* . . . */
}

src / app / অ্যাডমিন / অ্যাডমিন-রাউটিং.মডিউল.টস (সংক্ষিপ্তসার)

const adminRoutes: Routes = [
  {
    path: 'admin',
    component: AdminComponent,
    canActivate: [AuthGuard],
    children: [
      {
        path: '',
        canActivateChild: [AuthGuard],
        children: [
          { path: 'crises', component: ManageCrisesComponent },
          { path: 'heroes', component: ManageHeroesComponent },
          { path: '', component: AdminDashboardComponent }
        ]
      }
    ]
  }
];

@NgModule({
  imports: [
    RouterModule.forChild(adminRoutes)
  ],
  exports: [
    RouterModule
  ]
})
export class AdminRoutingModule {}

এটি https://angular.io/docs/ts/latest/guide/router.html#!# স্ক্যান- অ্যাক্টিভেট- গার্ড থেকে নেওয়া হয়েছে


2

এই কোডটি, লেখার ফাইলগুলি লেখুন

import { CanActivate } from '@angular/router';
import { Injectable } from '@angular/core';
import {  } from 'angular-2-local-storage';
import { Router } from '@angular/router';

@Injectable()
export class AuthGuard implements CanActivate {
constructor(public localStorageService:LocalStorageService, private router: Router){}
canActivate() {
// Imaginary method that is supposed to validate an auth token
// and return a boolean
var logInStatus         =   this.localStorageService.get('logInStatus');
if(logInStatus == 1){
    console.log('****** log in status 1*****')
    return true;
}else{
    console.log('****** log in status not 1 *****')
    this.router.navigate(['/']);
    return false;
}


}

}
// *****And the app.routes.ts file is as follow ******//
      import {  Routes  } from '@angular/router';
      import {  HomePageComponent   } from './home-page/home- page.component';
      import {  WatchComponent  } from './watch/watch.component';
      import {  TeachersPageComponent   } from './teachers-page/teachers-page.component';
      import {  UserDashboardComponent  } from './user-dashboard/user- dashboard.component';
      import {  FormOneComponent    } from './form-one/form-one.component';
      import {  FormTwoComponent    } from './form-two/form-two.component';
      import {  AuthGuard   } from './authguard';
      import {  LoginDetailsComponent } from './login-details/login-details.component';
      import {  TransactionResolver } from './trans.resolver'
      export const routes:Routes    =   [
    { path:'',              component:HomePageComponent                                                 },
    { path:'watch',         component:WatchComponent                                                },
    { path:'teachers',      component:TeachersPageComponent                                         },
    { path:'dashboard',     component:UserDashboardComponent,       canActivate: [AuthGuard],   resolve: { dashboardData:TransactionResolver } },
    { path:'formone',       component:FormOneComponent,                 canActivate: [AuthGuard],   resolve: { dashboardData:TransactionResolver } },
    { path:'formtwo',       component:FormTwoComponent,                 canActivate: [AuthGuard],   resolve: { dashboardData:TransactionResolver } },
    { path:'login-details', component:LoginDetailsComponent,            canActivate: [AuthGuard]    },

]; 

1

1. Create a guard as seen below. 2. Install ngx-cookie-service to get cookies returned by external SSO. 3. Create ssoPath in environment.ts (SSO Login redirection). 4. Get the state.url and use encodeURIComponent.

import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from 
  '@angular/router';
import { CookieService } from 'ngx-cookie-service';
import { environment } from '../../../environments/environment.prod';

@Injectable()
export class AuthGuardService implements CanActivate {
  private returnUrl: string;
  constructor(private _router: Router, private cookie: CookieService) {}

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    if (this.cookie.get('MasterSignOn')) {
      return true;
    } else {
      let uri = window.location.origin + '/#' + state.url;
      this.returnUrl = encodeURIComponent(uri);      
      window.location.href = environment.ssoPath +  this.returnUrl ;   
      return false;      
    }
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.