Angular 2 个角色和权限
Angular 2 roles and permissions
我在我的项目中使用了 angular2 和 laravel 5.3。在 laravel 中,当用户登录服务器时,将发送用户的权限以在 angular 中处理授权。所以我写了一个守卫来保护无法访问的用户的路线。
这是我的守卫 class 代码:
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;
}
}
既然路由是安全的,我想知道如何在组件 class 中访问用户权限。因为有时用户可以访问路由但他看不到 dom 的特定部分。我该如何处理这种情况?
您应该将权限存储在服务本身而不是守卫中。
因此,当用户进行身份验证时,您将权限存储在身份验证服务的 属性 中。然后在守卫中,你调用 this.authService.<property>
来使用权限。在任何其他组件中,您可以执行相同的操作,this.authService.<property
> 以获得用户的权限级别
由于服务将作为单例传递,所有组件都可以访问相同的 属性。
根据@Dave V 的回复,您可以实现自己的 "can" 服务,这会使代码更具可读性。例如:
@Injectable()
export class UserCan {
constructor (private _auth: AuthService)
{
}
public canDoWhatever()
{
return (this._auth.roles.indexOf("Whatever") > -1);
}
}
并且在你的 Component
中你可以注入它:
export class YourComponent {
private canDoWhatever: boolean;
constructor(private _userCan: UserCan) {
this.canDoWhatever = _userCan.canDoWhatever();
}
}
最后在你的 html:
<div *ngIf="canDoWhatever">
对于正在寻找图书馆的人,您可以查看 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 page。
我在我的项目中使用了 angular2 和 laravel 5.3。在 laravel 中,当用户登录服务器时,将发送用户的权限以在 angular 中处理授权。所以我写了一个守卫来保护无法访问的用户的路线。 这是我的守卫 class 代码:
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;
}
}
既然路由是安全的,我想知道如何在组件 class 中访问用户权限。因为有时用户可以访问路由但他看不到 dom 的特定部分。我该如何处理这种情况?
您应该将权限存储在服务本身而不是守卫中。
因此,当用户进行身份验证时,您将权限存储在身份验证服务的 属性 中。然后在守卫中,你调用 this.authService.<property>
来使用权限。在任何其他组件中,您可以执行相同的操作,this.authService.<property
> 以获得用户的权限级别
由于服务将作为单例传递,所有组件都可以访问相同的 属性。
根据@Dave V 的回复,您可以实现自己的 "can" 服务,这会使代码更具可读性。例如:
@Injectable()
export class UserCan {
constructor (private _auth: AuthService)
{
}
public canDoWhatever()
{
return (this._auth.roles.indexOf("Whatever") > -1);
}
}
并且在你的 Component
中你可以注入它:
export class YourComponent {
private canDoWhatever: boolean;
constructor(private _userCan: UserCan) {
this.canDoWhatever = _userCan.canDoWhatever();
}
}
最后在你的 html:
<div *ngIf="canDoWhatever">
对于正在寻找图书馆的人,您可以查看 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 page。