4

我在我的项目中使用了 angular2 和 laravel 5.3。在laravel中,当用户登录服务器时,将发送用户的权限以处理角度授权。所以我写了一个守卫来保护无法访问的用户的路由。这是我的警卫类代码:

export class AccessGuard implements CanActivate{

permissions;
currentRoute;
constructor(private authService:AuthService,private router:Router){
    this.permissions = this.authService.getPermissions();
}

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
    return this.checkHavePermission(state.url);
}

canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
    return this.checkHavePermission(state.url);
}

private checkHavePermission(url){
    switch (true) {
        case url.match(/^\/panel\/users[\/.*]?/):
            return this.getPermission('user.view');
        case url.match(/^\/panel\/dashboard/):
            return true;
        case url.match(/^\/panel\/permissions/):
            return this.getPermission('permissions.manager');
        case url.match(/^\/panel\/candidates[\/.*]?/):
            return this.getPermission('candidate.view');
    }
}


getPermission(perm){
    for(var i=0;i<this.permissions.length;i++){
        if(this.permissions[i].name == perm ){
            return true;
        }
    }
    return false;
}

}

现在路由是安全的,我想知道如何访问组件类中的用户权限。因为有时用户可以访问路由但看不到 dom 的特定部分。我该如何处理这种情况?

4

3 回答 3

6

您应该将权限存储在服务本身而不是守卫中。

因此,当用户进行身份验证时,您将权限存储在身份验证服务的属性中。然后在守卫中,您调用this.authService.<property>使用权限。在任何其他组件中,您都可以这样做,this.authService.<property> 以获取用户的权限级别

由于服务将作为单例传递,所有组件都可以访问相同的属性。

于 2016-09-28T14:02:27.580 回答
4

基于@Dave V 响应,您可以实现自己的“can”服务,这使代码更具可读性。例如:

@Injectable()
export class UserCan {

  constructor (private _auth: AuthService)
  {

  }

  public canDoWhatever()
  {
    return (this._auth.roles.indexOf("Whatever") > -1);
  }

}

在你Component的 s 你可以注入它:

export class YourComponent {
  private canDoWhatever: boolean;

  constructor(private _userCan: UserCan) {
    this.canDoWhatever = _userCan.canDoWhatever();
  }

}

最后在你的 html 中:

<div *ngIf="canDoWhatever">
于 2016-10-20T10:03:01.497 回答
3

对于正在寻找图书馆的人,您可以查看ngx-permissions。它将从 DOM 中删除一个元素,兼容惰性模块,兼容隔离模块,否则支持语法。

添加库

  @NgModule({

  imports: [
    BrowserModule,
     NgxPermissionsModule.forRoot()
  ],

})
export class AppModule { }

加载权限

constructor(private permissionsService: NgxPermissionsService,
       private http: HttpClient) {}

ngOnInit(): void {
    const perm = ["ADMIN", "EDITOR"];

    this.permissionsService.loadPermissions(perm);

     this.http.get('url').subscribe((permissions) => {
       //const perm = ["ADMIN", "EDITOR"]; example of permissions
       this.permissionsService.loadPermissions(permissions);
    })
  }

在模板中使用

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

如需更好的文档,请访问wiki 页面

于 2017-09-14T03:32:34.383 回答