- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Angular Material 中使用弹出登录,当我添加 Angular Universal 时,auth guard 是问题所在。如果某些路由受 auth guard 保护,则该页面只会开始挂起并且永远不会完成。没有 Angular Universal 的行为是在页面重新加载时它只是打开弹出窗口进行登录。
@Injectable()
export class AuthGuard implements CanActivate {
constructor(readonly auth: AuthService, public router: Router, private dialog: MatDialog, private store: Store<fromAuth.State>) {}
/** Performs the user authentication prompting the user when neeed or resolving to the current authenticated user otherwise */
public authenticate(action: loginAction = 'signIn') {
return this.store.pipe(
select(fromAuth.selectAuthState),
take(1),
switchMap(user => !user.user ? this.prompt(action) : of(user.user))
).toPromise();
}
public prompt(data: loginAction = 'signIn'): Promise<any> {
return this.dialog.open<LogInComponent, loginAction>(LogInComponent, { data }).afterClosed().toPromise();
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
// Gets the authorization mode when specified
// const mode = route.queryParamMap.get('authMode') || 'signIn';
// Prompts the user for authentication
return this.authenticate()
.then(user => !!user);
}
}
如果我直接访问 canActivate 中的 ngrx 商店它正在工作,但我想使用 .toPromise()
我正在使用 httponly cookies,每次重新加载时,Angular 都会向 nodejs 数据库发送 http 请求以获取用户数据。在所有其他路线上它都按预期工作。
最佳答案
目前没有太多时间,但有一些想法:
如果您在服务器端呈现 Angular 页面 (Angular Universal),为什么不在服务器端处理身份验证过程?检查用户是否在每个请求中登录并在登录页面上重定向用户 - 您将需要一个独立的登录页面而不是覆盖。
我有多个使用 AuthGuard/User/Auth 运行的项目,我不建议返回 promise,而是返回 canActivate 的 bool 值。
因为:
-> 这样你只能检查你的 canActivate 方法中是否设置了当前用户对象并返回 true 或 false。
所以在我看来:要么完全使用服务器端渲染,这意味着还要在后端检查用户的身份验证状态。或者将 Angular 用作真正的前端项目并在那里处理身份验证过程。混合这两个世界会导致一些棘手的问题,并使维护变得不必要的复杂。
示例路由
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { AuthGuardService, CanDeactivateGuard } from '@app/core/services';
import { AppPagesConfig } from '@app/config';
import * as Pages from '@app/pages';
const routes: Routes = [
{
path: 'dashboard',
component: Pages.DashboardPage,
canActivate: [AuthGuardService],
data: {
permissions: []
}
}, {
path: 'calendar',
children: [
{
path: '',
redirectTo: AppPagesConfig.calendarPersonal.path,
pathMatch: 'full'
}, {
path: AppPagesConfig.calendarPersonal.path,
component: Pages.CalendarPersonalPage,
canActivate: [AuthGuardService],
data: {
permissions: 'Foo-canEdit'
}
}, {
path: AppPagesConfig.calendarTeam.path,
component: Pages.CalendarTeamPage,
canActivate: [AuthGuardService],
data: {
permissions: '0100'
}
},
]
}, {
path: 'contacts',
children: [
{
path: '',
redirectTo: 'private',
pathMatch: 'full'
}, {
path: 'private',
component: Pages.ContactsPage,
canActivate: [AuthGuardService],
canDeactivate: [CanDeactivateGuard],
data: {
permissions: []
}
},
]
}, {
path: 'errors',
children: [
{
path: '',
redirectTo: '404',
pathMatch: 'full'
}, {
path: '404',
component: Pages.ErrorNotFoundPage
}, {
path: '403',
component: Pages.ErrorNoPermissionsPage
},
]
}, {
path: 'login',
component: Pages.LoginPage
}, {
path: '**',
component: Pages.ErrorNotFoundPage
}
];
@NgModule({
imports: [
RouterModule.forRoot(routes, {
useHash: true
})
],
exports: [
RouterModule
]
})
export class AppRoutingModule { }
示例用户模型
import { uniq, union } from 'lodash';
import { UserBaseModel } from '@app/models/user-base';
import { Deserializable } from './deserializable.model';
export class User implements Deserializable {
public permissions: string[];
/**
* Call this function to fill the model with data.
*/
public deserialize(input: UserBaseModel): this {
Object.assign(this, input);
this.updateUserPermissions();
return this;
}
/**
* Checks if the user has all required permissions.
*/
public hasPermissions(requiredPermissions: string[]): boolean {
// If there where no required permissions given it is valid.
if (!requiredPermissions || !requiredPermissions.length) {
return true;
}
// If there are required permissions given but the user has no permissions at all it is always invalid.
if (requiredPermissions.length && !this.permissions.length) {
return false;
}
// Check the users permissions to contain all required permissions.
for (const permission of requiredPermissions) {
if (!this.permissions.includes(permission)) {
return false;
}
}
return true;
}
}
AuthGuard 示例
import { isEmpty } from 'lodash';
import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { SessionService } from './session.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuardService implements CanActivate {
constructor(
private readonly _router: Router,
private readonly sessionService: SessionService
) { }
/**
* Check if user is allowed to navigate to the new state.
*/
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
const currentUser = this.sessionService.getCurrentUser();
// Not logged in so redirect to login page.
if (!currentUser) {
this.sessionService.logoutUser();
this._router.navigate(['/login']);
return false;
}
// Route is not protected so continue (for routes without auth permission needed).
if (isEmpty(route.data) || !route.data.permissions || !route.data.permissions.length) {
return true;
}
// If the permissions do not match redirect.
if (currentUser && !currentUser.hasPermissions(route.data.permissions)) {
this._router.navigate(['/errors/403'], {
queryParams: {
referrerUrl: state.url
}
});
return false;
}
// If the permissions do match continue.
if (currentUser && currentUser.hasPermissions(route.data.permissions)) {
return true;
}
// If nothing matches log out the user.
this.sessionService.logoutUser();
this._router.navigate(['/login']);
return false;
}
}
关于Angular Universal - Auth Guard 未决问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65389193/
请帮助我了解如何在 Angular Universal 中使用服务器渲染。 我做了什么。我访问了 Angular Universal 官方网站。设置 Node.js。下载推荐项目 Angular 2
我正在研究使用 explicit universes 的可能性用于在 Coq 中构建固定的 Universe 层次结构。在构建它时使用常量 (2, 3, 4) 的尝试失败了:最后,所有组合仍然类型检查
我查看了 Universal Analytics,但没有找到问题的正确答案。 如何将这一行从旧的 Analytics 更新到新的 Universal Analytics? _gaq.push(["_s
我在 IIS 中部署 angular 通用应用程序时遇到问题。在 angular 通用中,创建了两个 dist 文件夹,一个是客户端的 dist,另一个是 dist-server,当我尝试托管时,我提
我使用@ng-toolkit/universal 作为我的服务器端渲染方法。一切正常,没有我的图像。我正在动态地获取它们。因此,当用户没有头像时,会显示一个占位符图像。因此我正在使用这个函数: ver
-编译应用程序后,我多次收到此错误 enter image description here 文本错误: 错误错误 at XMLHttpRequest.send (C:\Users\seva-
我正在Win10中使用VS2015开发通用应用程序。模拟器和android模拟器运行正常。 但是,当我启动Windows Phone Mobile模拟器时,该模拟器运行并显示“操作系统正在启动”,然后
我正在实现一个路由保护(CanActivate 接口(interface)),我需要在某些条件下重定向到未找到的页面。这可以通过以下语句来实现: if (isNode){ let res : Resp
我偶然发现了一个奇怪的情况,其中有 reflect.runtime.universe._进口原因reflect.runtime.universe.RuntimeClass推断它似乎在哪里Nothing
每当我在我的应用程序中加载图像时,我的 logcat 都会给我这条消息。 04-09 19:09:59.241: W/ImageLoader(276): Try to initialize Image
我正在尝试添加包但出现错误 meteor add universe:carousel => Errors while adding packages: 选择软件包版本时: error: Confli
所以我一直在尝试将我的应用程序转换为 angular universal,并且在大多数情况下都很好。但我之前读过一些“陷阱”:https://github.com/onespeed-articles/
我有一个指令,使文本输入到谷歌的地方自动完成输入,看起来像: import { Directive, AfterViewInit , Output, EventEmitter, NgZone, Ele
大约一年前,我们升级到了通用Analytics(分析),由于升级我们的站点搜索并没有在我们的Analytics(分析)帐户中显示关键字,甚至没有跟踪其使用次数。 作为营销人员,这是一个问题,因为我想知
我正准备使用 Angular Universal 为我的 Angular 7 应用程序设置 SSR。我遵循了官方文档( https://angular.io/guide/universal )。我到了
在应用程序关闭(暂停)后,我正在将一个不大于 10KB 的数据文件写入 RoamingFolder。该应用程序在开发桌面和 Surface 2 上运行,两者都登录到同一个 Microsoft 帐户。但
This question already has answers here: Page Navigation using MVVM in Store App (5个答案) 6年前关闭。 使用MVVM
我尝试安装iOS-Universal-Framework 。尝试运行instalation shell screept从这个存储库并始终获取消息: iOS Real Static Framework
这就是我目前初始化 chromedriver 的方式 System.setProperty("webdriver.chrome.driver", "C://chromedriver.exe"); 但是
您好,我在尝试运行 perl 脚本时遇到以下错误: pc:~/Phd/lenovo/programs/vep/scripts/variant_effect_predictor$ perl varian
我是一名优秀的程序员,十分优秀!