【问题标题】:Angular routing change in urlurl中的角度路由更改
【发布时间】:2018-12-10 18:38:41
【问题描述】:

我正在制作 Angular 7 应用程序,我正在通过路由器和身份验证保护进行重定向..

HTML:

https://stackblitz.com/edit/angular-6-jwt-authentication-example-tsu2sm?file=app%2Fhome%2Fhome.component.html

<p *ngIf="showUserRoute">
  <a [routerLink]="['/user']">User</a>
</p>
<p><a [routerLink]="['/login']">Logout</a></p>

在这里你可以看到一个ngIf

<p *ngIf="showUserRoute">
  <a [routerLink]="['/user']">User</a>
</p>

ts:

https://stackblitz.com/edit/angular-6-jwt-authentication-example-tsu2sm?file=app%2Fhome%2Fhome.component.ts

ngOnInit() {

let user = JSON.parse(localStorage.getItem('currentUser'));

 console.log(user.token);

 if(user.token == "fake-jwt-token") {
   this.showUserRoute = false;
 }

}

这里如果user.token == "fake-jwt-token" 那么我不应该允许用户导航到user url..

它现在隐藏了网址,没问题..

问题是即使&lt;a [routerLink]="['/user']"&gt;User&lt;/a&gt; 处于隐藏状态,用户可以手动更改网址,因此如果他将网址设为类似,

最后在url中添加用户

https://angular-6-jwt-authentication-example-tsu2sm.stackblitz.io/user,它正在重定向到用户页面..

我的要求是,如果用户像上面那样更改 url,则不应允许,并且重定向需要发生在以前的状态..

您可以探索正在工作的 stackblitz https://stackblitz.com/edit/angular-6-jwt-authentication-example-tsu2sm

你可以得到我需要的东西..

在stackblitz中,如果你给https://angular-6-jwt-authentication-example-tsu2sm.stackblitz.io/user,那么它将重定向到用户组件,但是我们的主页有一个条件,如果登录用户有"fake-jwt-token",那么用户是严格不允许访问user url 和组件..

编辑

我不是要阻止登录,用户可以登录并可以带回家组件但如果用户有fake-jwt-token,那么他不能去/user单独的url,但他可以访问其他页面..

拥有fake-jwt-token的用户可以成功登录,但需要防止进入https://angular-6-jwt-authentication-example-tsu2sm.stackblitz.io/user

第 1 步:

用户可以使用 test 和 test 作为用户名和密码登录

第 2 步:

在提供凭据后,用户将被重定向到主组件。

第 3 步: 现在登录的用户有fake-jwt-token 所以在登录后限制他访问user 组件所以如果他从主组件https://angular-6-jwt-authentication-example-tsu2sm.stackblitz.io/user 给出这样的url,然后重定向回主组件..

请帮助我阻止用户使用“fake-jwt-token”进入用户路由 url..

【问题讨论】:

  • 你的意思是登录一次后直接修改路由url?如果您还没有登录,它可以正常工作。
  • @xyz,截至登录没有问题,但登录后如果令牌是假 jwt 令牌,则不允许用户访问用户组件,因此他无法直接移动到用户 url..
  • 那为什么会错过应用您在 Auth Guard 的 Home 组件中应用的条件:D
  • @xyz,对不起,我无法联系到你。我是 Angular 新手,所以即使在基于假 jwt 令牌登录后,我也无法阻止用户进行此类重定向。因此寻求帮助请帮助我使用我提供的相同 stackblitz 以便我更好地理解..

标签: javascript angular typescript angular6 angular-routing


【解决方案1】:

使用与 Home 组件中相同的条件修改 Auth Guard。

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    let currentUser = localStorage.getItem('currentUser') ? JSON.parse(localStorage.getItem('currentUser')): null;
    if (currentUser && currentUser.token != "fake-jwt-token") {
        // logged in and doesn't have fake token
        return true;
    }
    // not logged in so redirect to login page with the return url
    this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
    return false;
}

实现此目的的一种简单而干净的方法是为 HomeComponent 设置单独的保护。

@Injectable({ providedIn: 'root' })
export class HomeGuard implements CanActivate {
  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
      let currentUser = localStorage.getItem('currentUser');
        if (currentUser) {
            // logged in so return true
            return true;
        }
        return false;
    }
}

并让您的路线如下:

const appRoutes: Routes = [
    { path: '', component: HomeComponent, canActivate: [HomeGuard] },
    { path: 'login', component: LoginComponent },
    { path: 'user', component: UserComponent, canActivate: [AuthGuard] },
    // otherwise redirect to home
    { path: '**', redirectTo: '' }
];

在此处查看示例:https://stackblitz.com/edit/angular-6-jwt-authentication-example-42ft5j?file=app%2F_guards%2Fhome.guard.ts

【讨论】:

  • @undefined: 可以在这里查看:stackblitz.com/edit/…
  • 如果我分别在登录用户名和密码中进行测试和测试,它没有重定向主页组件..请重新检查堆栈闪电..
  • @undefined:你是对的,它不应该。因为那个用户有fake-jwt-token
  • 我不确定我是否解释清楚.. 用户可以登录并可以进入主组件,但如果他有fake-jwt-token,他不能单独进入用户组件,但登录后他可以去任何地方..
  • 只有拥有fake-jwt-token的用户才限制了用户路由器链接,但他可以成功登录并进入主页..没有问题..
【解决方案2】:

您应该在 AuthGuard 中进行更改,因为您的 '''user' 路由已经受到它的保护。

AuthGuard 的实现更改为以下内容:

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

@Injectable({ providedIn: 'root' })
export class AuthGuard implements CanActivate {

  constructor(private router: Router) { }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    const userFromStorage = localStorage.getItem('currentUser');
    let currentUser = userFromStorage ? JSON.parse(userFromStorage) : null;
    if (currentUser) {
      if(currentUser.token !== "fake-jwt-token" || route.component.name !== 'UserComponent') {
        return true;
      } else {
        this.router.navigate(['/']);
        return true;
      }
    }
    this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
    return false;
  }
}

这里有一个Working Sample StackBlitz 供您参考。

【讨论】:

  • 登录后没有重定向到主组件。它显示加载很长时间,没有任何反应。你能检查一下吗??
  • 感谢您的解决方案,请阅读我编辑的问题。用户可以登录,但如果他有fake-jwt-token,则不应只允许访问/user路由器链接..
  • 是的。因为您仅在 '''/user' 路径上配置了 AuthGuard。
  • 我怎样才能根据我的要求改变它..我想我现在已经不太清楚了..用户可以登录并可以转到主页但他无法访问用户routerlink一个人..请帮助我实现结果..
  • 简单来说,如果用户在登录后更改了https://angular-6-jwt-authentication-example-tsu2sm.stackblitz.io/user 之类的url,那么它不应该带到用户组件,而是可以带到主组件本身,因为用户有fake-jwt-token..跨度>
猜你喜欢
  • 1970-01-01
  • 2017-04-23
  • 2021-09-21
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多