2016-11-24 92 views
5

什麼是實現ACL /最好的辦法紙基具有角2?如何使用角度2來實現基於ACL /角色的授權?

我的情況下,簡單地說,是這樣的:角色是動態的,是基於權限的客戶端可以配置也可以是動態的。

我需要防止用戶能夠訪問,他沒有被授權做一個特定的資源。爲此我想到了使用角度守衛的概念。使用CanActivate Guard,我可以根據每條路線中放置的信息設置是否讓用戶通過。該信息將是該路線所涉及的資源的名稱。當我找到後衛時,我可以與他的角色進行比較,看看他的角色是否可以使用此功能以及是否允許導航。

但隨着在可能落入兩個問題:

1 - 如何給用戶,他有訪問資源重定向?我是否必須列出路線文件並尋找與他的角色兼容的人,然後在那裏重定向?

2 - 如何禁用它不能在它可以訪問頁面上看到的組件?例如,它可以訪問列表頁面X,但它無權創建新項目,所以我需要刪除創建按鈕。或者說,如何使用包含某些角色的特定信息而不是角色的div元素來實現這一點?

我想知道如何最好地角生態系統中處理這個情況。

感謝收聽。

+0

警告:Angular 2將所有內容放在客戶端,因此「保護」Angular中的資源(即:密鑰或d ata對象)是不可能的,你必須在數據源處做到這一點。 所以你真正看着隱藏/顯示可視化組件和重定向,在這裏: [隱藏菜單項(可以擴展到按鈕,數據對象等)] (http://stackoverflow.com/questions/36041192/angular2-how-to-hideno-render-the-link-in-the-menu-after-check-access) [Redirecting] (http://stackoverflow.com/questions/32896407/redirect-within-component -angular-2)。我們從數據源中提取ACL。 – davmor

+0

我不確定你是否已經找到解決問題的方法。不過,我想指出的是,爲[隱藏菜單項目]提供的鏈接@davmor已過時,因爲它使用舊版路由器,因爲它已被棄用。使用當前的路由器,無法獲取路由數據,直到注入ActivatedRoute ...之後,纔可以訪問它的數據。 – 12seconds

回答

1

你可以嘗試使用ngx-permissions庫這一點。 它支持,然後,否則語法,延遲加載,孤立的延遲加載。庫添加到項目:

@NgModule({ 

imports: [ 
    NgxPermissionsModule.forRoot() 
] 
}) 
export class AppModule { } 

負荷角色

NgxRolesService 
.addRole('ROLE_NAME', ['permissionNameA', 'permissionNameB']) 

NgxRolesService.addRole('Guest',() => { 
    return this.sessionService.checkSession().toPromise(); 
}); 

NgxRolesService.addRole('Guest',() => { 
    return true; 
}); 

在模板中使用

<div *ngxPermissionsOnly="['ADMIN', 'GUEST']"> 
    <div>You can see this text congrats</div> 
</div> 

保護你的衛隊

const appRoutes: Routes = [ 
{ path: 'home', 
component: HomeComponent, 
canActivate: [NgxPermissionsGuard], 
data: { 
    permissions: { 
    only: ['ADMIN', 'MODERATOR'], 
    except: ['GUEST'] 
    } 
    } 
}, 
]; 

對於詳細的文檔結帳wiki page

0

檢查CASL,大約有整合VueAurelia但對角2+實施應該是非常相似的文章

,你可以定義每個用戶的能力的主要思路

import { AbilityBuilder } from 'casl' 


// allow to read and create Todo-s for everybody and update for assignees 
export default AbilityBuilder.define(can => { 
    can(['read','create'], 'Todo') 
    can(['update'], 'Todo', { assignee: user.id }) 
}) 

另外也在文檔中有關如何map abilities to different roles