【发布时间】:2018-04-19 00:27:56
【问题描述】:
我目前有一个主页,可以路由到我公司运行的所有不同工作流程。我们有大约 15 个不同的工作流程,每个工作流程都由一个用户角色保护。如果您在数据库中没有正确的用户角色,您将看不到指向该页面的相应链接。我们保护服务器端点,但我担心的是向人们展示链接的最佳方式是什么,或者不向他们展示我不想重复代码。
这是一种方法:
我有一个这样的html页面
<ul>
<li *ngIf="authService.hasRequiredRole('users.user-admin')" routerLink="/user">Users</li>
<li *ngIf="authService.hasRequiredRole('users.role-admin')" routerLink="/role">Roles</li>
</ul>
我有这样的身份验证服务:
hasRequiredRole(roles: string | [string]) {
if (typeof roles === 'string') {
roles = [roles];
}
for (const roleSlug of roles) {
if (this.user.roles.find((role: any) => {
return role.slug === roleSlug;
})) {
return true;
}
}
return false;
}
我有一个路由如下的路由器:
const routes: Routes = [{
path: 'user',
data: {
allowedRoles: 'users.user-admin'
},
loadChildren: 'app/user/user.module#UserModule',
canActivate: [AuthGuard]
},
{ path: 'home', component: HomeComponent }]
AuthGuard 只是检查用户是否登录,然后使用路由中的数据检查用户是否具有正确的角色。
如您所见,我们在两个不同的位置使用字符串“users.user-admin”。
我认为我们应该有一个带有两个保护装置的路由器。一名守卫将检查用户是否已登录,另一名守卫将检查用户是否具有正确的角色。该角色将在此处进行硬编码,如下所示:
export class UserAdminGuard implements CanActivate {
constructor(private router: Router, private authService: AuthService) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable < boolean > | Promise < boolean > | boolean {
return this.authService.hasRequiredRole('users.user-admin');
}
}
然后 html 看起来像这样:
<ul>
<li *ngIf="userAdminGuard.canActivate()" routerLink="/user">Users</li>
<li *ngIf="roleAdminGuard.canActivate()" routerLink="/role">Roles</li>
</ul>
像我的方法这样的方法会起作用吗,还是有更好的更角度的方法来做到这一点?我在文档中找不到任何关于此类的内容。如果您还可以提供文档加分。
【问题讨论】:
-
顺便说一句,你真的是指 tuple
[string](一个长度正好为 1 的Array,包含一个string)或者更确切地说是string[]或Array<string>?我问是因为,虽然完全允许,但我从未在生产 Angular 中看到它。 -
我的意思是它可以是字符串数组或字符串,因此您可以提供 ['role1','role2'] 或 'role'
-
好的,TypeScript 中的字符串数组被声明为
string[]或Array<string>。另一方面,[string]是元组类型,这意味着您声明的唯一有效类型是与您定义的格式完全相同 的数组。在这种情况下,长度为 1 的数组带有 1 个字符串(请参阅原始评论中的链接)。同样,您可以声明x: [string, number, number]之类的内容,其中["a", 1, 2]有效,但["a", "b", "c"]无效。
标签: angular angular-template angular-router angular-router-guards