2016-11-24 119 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