如果用户未登录,如何重定向到登录页面?
How to redirect to login page if the user is not logged in?
我实现了登录前和登录后保护,让部分用户无法访问所有页面。我的问题是,当用户未登录时以及当他们尝试进入未经授权的页面(例如 "localhost:4200/restricted_page" 时,应该将其重定向到登录页面 "localhost:4200/login"。但我无法重定向到登录页面。现在它只重定向到 localhost:4200。
我应该在哪里修改代码?
之前-login.guard
export class BeforeLoginGuard implements CanActivate {
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return !this._tokenService.loggedIn();
}
constructor(private _tokenService: TokenService) { }
}
之后-login.guard
export class AfterLoginGuard implements CanActivate {
constructor(private _tokenService: TokenService) { }
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this._tokenService.loggedIn();
}
}
token.service
export class TokenService {
payload(token) {
const payload = token.split('.')[1];
//decoding
if (typeof (payload) !== 'undefined')
return JSON.parse(atob(payload));
return false;
}
loggedIn() {
// return this.isValid();
const token = this.getToken();
console.log("token", token);
if (token) {
const payload = this.payload(token);
if (payload) {
return Object.values(this.iss).indexOf(payload.iss) > -1 ? true : false;
}
}
return false;
}
}
通过 this.router.navigate([ '/login'])
使用 @angular/router
导航,或者只在您的路线声明中使用 redirectTo
我相信 localhost:4200/restricted_page
- 这条路线会有 AfterLoginGuard .
所以在那个组件中
canActivate( next: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
let flag = this._tokenService.loggedIn();
if(flag ){
return flag ;
} else {
// Navigate to login component. You will have to add router to constructor
and then this.router.navigate(['/login']);
return;
}
return flag;
}
理想情况下,我认为应该只有一个具有不同条件的 Auth gaurd。但是无论如何你已经开发了上面的 2 对你有用。
根据登录状态在 canActivate
方法中导航为:
constructor(private router: Router,
private _tokenService: TokenService) {
}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
if(this._tokenService.loggedIn()) {
return true;
} else {
this.router.nvigate['/login']; <=== navigate wherever you want
return false;
}
}
我实现了登录前和登录后保护,让部分用户无法访问所有页面。我的问题是,当用户未登录时以及当他们尝试进入未经授权的页面(例如 "localhost:4200/restricted_page" 时,应该将其重定向到登录页面 "localhost:4200/login"。但我无法重定向到登录页面。现在它只重定向到 localhost:4200。
我应该在哪里修改代码?
之前-login.guard
export class BeforeLoginGuard implements CanActivate {
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return !this._tokenService.loggedIn();
}
constructor(private _tokenService: TokenService) { }
}
之后-login.guard
export class AfterLoginGuard implements CanActivate {
constructor(private _tokenService: TokenService) { }
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this._tokenService.loggedIn();
}
}
token.service
export class TokenService {
payload(token) {
const payload = token.split('.')[1];
//decoding
if (typeof (payload) !== 'undefined')
return JSON.parse(atob(payload));
return false;
}
loggedIn() {
// return this.isValid();
const token = this.getToken();
console.log("token", token);
if (token) {
const payload = this.payload(token);
if (payload) {
return Object.values(this.iss).indexOf(payload.iss) > -1 ? true : false;
}
}
return false;
}
}
通过 this.router.navigate([ '/login'])
使用 @angular/router
导航,或者只在您的路线声明中使用 redirectTo
我相信 localhost:4200/restricted_page
- 这条路线会有 AfterLoginGuard .
所以在那个组件中
canActivate( next: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
let flag = this._tokenService.loggedIn();
if(flag ){
return flag ;
} else {
// Navigate to login component. You will have to add router to constructor
and then this.router.navigate(['/login']);
return;
}
return flag;
}
理想情况下,我认为应该只有一个具有不同条件的 Auth gaurd。但是无论如何你已经开发了上面的 2 对你有用。
根据登录状态在 canActivate
方法中导航为:
constructor(private router: Router,
private _tokenService: TokenService) {
}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
if(this._tokenService.loggedIn()) {
return true;
} else {
this.router.nvigate['/login']; <=== navigate wherever you want
return false;
}
}