0
votes

Tournez la sortie de Loginguard sur False

Je voudrais gagner l'accès de l'utilisateur à la page / login si un cookie n'a pas encore été défini, mais aussi les accéder à la page / à la recherche si le cookie a déjà été défini.

app- Routage.Modules.ts strong> P>

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import {SearchComponent} from '../search/search/search.component';
import {CookieService} from 'ngx-cookie-service';
import {LoginService} from './login.service';

@Injectable({
  providedIn: 'root'
})
export class LoginGuard implements CanActivate {
  constructor(private searchComponent: SearchComponent, private cookieService: CookieService, private loginService: LoginService) {
  }
  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): any {
    return this.hasAccess();
  }

  hasAccess() {
    return new Promise(resolve => {
      this.loginService.hasCookie(this.cookieService.get('login')).subscribe(hasCookie => {
        if (hasCookie === 1) {
          return new Promise(() => {
            this.loginService.getCookie().subscribe(cookieFromServer => {
              if (cookieFromServer === this.cookieService.get('login')) {
                return resolve(true);
              } else {
                return resolve(false);
              }
            });
          });
        }
        return resolve(false);
      });
    });
  }
}


0 commentaires

3 Réponses :


0
votes

Vous devez rediriger du constructeur de la vue que vous enregistrez, par exemple xxx

dans le constructeur de connexion et l'inverse dans le constructeur de recherche


1 commentaires

J'ai essayé cela, mais le problème est que le composant sera chargé et que l'utilisateur verra la page pendant environ 1 seconde, puis ils seront redirigés. Je voudrais empêcher cela et c'est pourquoi je travaille avec Routreguard.



1
votes

première recommandation, déplacez la logique «Hasaccess» dans le loginguard pour supprimer la dépendance sur les composants.

De ma compréhension, vous souhaitez naviguer vers la recherche si l'utilisateur est déjà connecté. Cela devrait vous mettre sur la bonne voie. J'espère que cela aide! xxx


6 commentaires

J'ai essayé cela, mais le problème est que le composant sera chargé et que l'utilisateur verra la page pendant environ 1 seconde, puis ils seront redirigés. Je voudrais empêcher cela et c'est pourquoi je travaille avec Routreguard.


Par Documents angulaires, la page elle-même ne doit pas être activée tant que la Garde d'itinéraire se termine. Avec le code que vous avez fourni, la page ne doit pas être rendu. Y a-t-il une fonction ASYNC dans votre logique de cookie?


Oui, il y a même une fonction Async dans une fonction async. J'ai mis à jour ma question, vous voyez donc tout le code.


`Retournez ceci.loginservice.hascookie (this.cookieservice.get ('login')) .pipe (ConcaTMap ((HASCOOKIE: Boolean) => {if (getcookie) {retour this.loginservice.getcookie (). plan ( Cookiefromserver => {// Peut avoir à faire cela un objet observable Ie de () retour Cookiefromserver === this.cookieservice.get ('login');})} // peut avoir à en faire une observable à savoir (faux) retourner faux;})) `


Je ne suis pas très bon avec les promesses, ce qui était la meilleure tentative d'une interprétation observable. Quoi qu'il en soit, vous ne voulez pas faire les abonnements là-bas. Puisque Canactivate Retour un observable, notre travail consiste à lui fournir un observable et il gérera l'abonnement. Faites-moi savoir si cela vous fait du bien.


Je pourrais déjà résoudre ce problème en ajoutant si (this.location.path () === '/ Connexion') (voir ma réponse). Merci quand même pour votre soutien!



0
votes

Je pourrais corriger mon problème en ajoutant si (this.location.path () === '/ Connexion') code> à la fonction hasaccess () code>. L'instruction IF est ajoutée deux fois pour atteindre l'objectif, de sorte que / la connexion obtient le but opposé à /rsearch.

hasAccess() {
  return new Promise(resolve => {
    this.loginService.hasCookie(this.cookieService.get('login')).subscribe(hasCookie => {
      if (hasCookie === 1) {
        return new Promise(() => {
          this.loginService.getCookie().subscribe(cookieFromServer => {
            if (cookieFromServer === this.cookieService.get('login')) {
              console.log(this.location.path());
              if (this.location.path() === '/login') {
                return resolve(false);
              }
              return resolve(true);
            } else {
              return resolve(false);
            }
          });
        });
      }
      if (this.location.path() === '/login') {
        return resolve(true);
      }
      return resolve(false);
    });
  });
}
p>


0 commentaires