2017-09-05 82 views
2

我正在使用路線衛兵保護我的Angular應用程序的前端。在過去與他們合作並在線研究的過程中,爲路線添加多個警衛需要所有都返回true以允許訪問。角路線衛兵:或對比和

但是如果我想只有一個返回true以允許訪問? (如||代替& &)

例如,我的路線警衛尋找在用戶的令牌某些角色:

@Injectable() 
export class ActiveRoleGuard implements CanActivate { 
    constructor(private sessionService: SessionService, private router: Router) { } 


    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
     let token = this.sessionService.getToken(); 

     if (!token) { 
      return false; 
     } 

     if (token.role.toLowerCase().indexOf("active") < 0) { 
      this.router.navigate(["/issue"]); 
      return false; 
     } 

     return true; 
    } 
} 

@Injectable() 
export class AdminRoleGuard implements CanActivate { 
    constructor(private sessionService: SessionService, private router: Router) { } 


    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
     let token = this.appSessionService.getToken(); 

     if (!token) { 
      return false; 
     } 

     if (token.role.toLowerCase().indexOf("admin") < 0) { 
      this.router.navigate(["/issue"]); 
      return false; 
     } 

     return true; 
    } 
} 

如果我是通常在一個路由器模塊,它會像這樣...

{path: "someroute", component: SomeComponent, canActivate: [ActiveRouteGuard, AdminRouteGuard]}

...但這需要用戶既是ActiveAdmin。但如果我想強制執行Active或者Admin a Manager

很簡單執行的API 像這樣:

[Authorize(Roles = "Active")] 
[Authorize(Roles = "Admin, Manager")] 
public class SomeController : ApiController 

但我怎麼做到這一點的角?

+0

你可以做一個單一的後衛來管理這兩種情況,儘管它並不那麼幹淨,我還沒有看到任何其他解決方案...... 這就是說,管理員看起來很奇怪,沒有一些令牌檢查以及。你可以通過給你的代幣添加一個'admin'角色來解決這個問題 –

+0

我寧願不加以合併,因爲目前有6個角色具有重疊權限。但如果Angular不支持這種方式,那麼這是我的最佳選擇 –

回答

2

而不是有兩個單獨的CanActivate實現,你可以使用一個可以「配置」的單一版本。爲此,您可以利用Routedata財產。例如,在你的路線,你可以這樣做:

{ 
    path: "someroute", 
    component: SomeComponent, 
    canActivate: [RoleRouteGuard], 
    data: { 
     requiredRoles: ["Role1", "Role2", "Role3"] 
    } 
} 

利用這一點,你可以把你的現有CanActivate實現之一,並使其更通用。您可以通過ActivatedRouteSnapshotdata訪問requiredRoles酒店。例如:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
    const requiredRoles = route.data.requiredRoles; 
    .... 

一旦你得到了這一點,你可以檢查令牌的作用是在陣列中,等等,等等

如果你有一個永遠需要Active角色,然後單的AdminManager角色,你也可以擴展這個有多個data屬性。例如,你可以有requiredRolesatLeastOneOfRoles並更新你的邏輯來相應地處理......現在有很多選擇,但我認爲你不需要幫助。

+0

創意解決方案,我不喜歡在不同地方傳遞如此多的字符串文本以防這些角色更改或重命名。否則,這是一個有趣的解決方案。 –

+0

在這種情況下,您可以使用常量代替硬編碼字符串。您突出顯示的問題與Web API屬性方法完全相同。沒有? –

+2

@NathanFoss你可以在這種情況下使用枚舉。 – developer033