我正在使用延迟加载在我的应用程序中呈现页面。
{ path: 'dashboard', loadChildren: './dashboard/dashboard.module#DashboardModule', canActivate: [AuthGuard] }
问题是,如果我在 URL 中键入 www.mydomain.com/dashboard,浏览器实际上会呈现仪表板页面,即使用户没有登录并且在一两秒后重定向到登录屏幕。
如果用户未登录,如何防止浏览器呈现任何页面?基本上它应该直接重定向到登录页面。
AuthGuard 类
export class AuthGuard implements CanActivate {
result: boolean = false;
auth: any;
outRes: any;
constructor(private _authService: JwtService, private _router: Router) {
}
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
this.outRes = this._authService.isAuthenticated();
if (this.outRes) {
this.outRes.subscribe(o => o ? true : this._authService.redirectToLogin());
return true;
} else {
this._authService.redirectToLogin();
return false;
}
}
}
服务等级
public isAuthenticated() {
if (!this.loggedIn)
this.redirectToLogin();
return this.httpClient.get<boolean>(`${this.settings.getApiSettings('uri')}/api/auth/IsTokenValid`, {
params: { token: this.getToken }
}).map( /// <<<=== use `map` here
(response) => {
if (response !== null) {
var receivedToken = response["securityStamp"];
var availableToken = localStorage.getItem('access_token');
//Check if received a refreshed token. (tokens are refreshed every 15 minutes)
if (receivedToken && receivedToken !== availableToken) {
localStorage.removeItem('access_token');
localStorage.setItem('access_token', response["securityStamp"]);
}
}
let data = response;
if (data == null)
return false;
else
return true;
}
);
}
redirectToLogin() {
localStorage.removeItem('access_token');
window.location.href = "./login";
}