聊聊在Angular项目中怎么实现权限控制?

 3038

Angular项目中怎么实现权限控制?下面本篇文章通过代码实例来聊聊 Angular 项目实现权限控制的方法,希望对大家有所帮助!


聊聊在Angular项目中怎么实现权限控制?


上一篇文章我们讲到了 Angular 组件通信。本文我们讲讲,在项目开发中,你是否会遇到这样的需求:请根据用户登陆,限制其访问的内容。

So,这就是要进行权限控制

对用户的权限限制,我们一般会有下面的处理方式:

对用户登陆的菜单做控制

对用户的行为做限制

我们结合 Angular 来讲解下这个话题。


菜单路由控制

聊聊在Angular项目中怎么实现权限控制?


系统开发的时候,会有很多的菜单,这个时候,就需要后端判断用户的角色,按照用户的权限返回不同的菜单路由。

返回的数据格式需要我们按照自己在 app-routing.module.ts 中编写好的路由路径对应。

比如,我们有路由文件如下:

  1. // app-routing.module.ts
  2.  
  3. const routes: Routes = [
  4.   {
  5.     path: 'user-manage',
  6.     component: AuthLayoutComponent, // 通过鉴权的组件
  7.     children: [
  8.       {
  9.         path: '',
  10.         redirectTo: 'user',
  11.         pathMatch: 'full'
  12.       },
  13.       {
  14.         path: 'user', // 用户列表
  15.         component: UserComponent
  16.       },
  17.       {
  18.         path: 'user/detail/:uuid', // 用户详情,类似这种不会出现在菜单里面
  19.         component: UserDetailComponent
  20.       },
  21.       {
  22.         path: 'department', // 部门列表
  23.         component: DepartmentComponent
  24.       }
  25.     ]
  26.   },
  27.   // ...
  28. ]

在页面中,我们的菜单展示的数据是这样子的:

  1. <!-- demo.component.html -->
  2.  
  3. <ul nz-menu nzMode="inline" [nzInlineCollapsed]="isCollapsed">
  4.   <li *ngFor="let submenu of menu_data" nz-submenu [nzTitle]="isCollapsed ? '' : submenu.title" [nzIcon]="submenu.icon"
  5.     [nzOpen]="submenu.is_open" (nzOpenChange)="selectMenu(submenu)">
  6.     <ul>
  7.       <li *ngFor="let child of submenu?.children" nz-menu-item nzMatchRouter>
  8.         <a [routerLink]="['/' + child.url]">{{ child.title }}</a>
  9.       </li>
  10.     </ul>
  11.   </li>
  12. </ul>

定义了一个二级的菜单,拥有下面几个字段:

title 字段 - 菜单的标题

url 字段 - 菜单的路由,对应 app-routing.module.ts 中的完整的 path

icon 字段 - 标题前的小图标,二级标题没有

is_open 字段 - 菜单是否展开的标识

此时,后端的菜单接口,应该返回类似下面的数据:

  1. // demo.component.ts
  2.  
  3. public menu_data:any = [
  4.   {
  5.     title: "成员管理",
  6.     url: "user-manage",
  7.     icon: "user-switch", // 这里是用了 angular ant design 的图标
  8.     is_open: false,
  9.     children: [
  10.       {
  11.         title: "用户",
  12.         url: "user-manage/user",
  13.         icon: undefined,
  14.         is_open: false
  15.       },
  16.       {
  17.         title: "部门",
  18.         url: "user-manage/department",
  19.         icon: undefined,
  20.         is_open: false
  21.       }
  22.     ]
  23.   },
  24.   // ...
  25. ]

也许你会有疑问?️:二级标题中都用不上 icon 和 is_open 这两个字段,为啥还要写?

嗯~,读者可以对后端返回提要求,但是为了保持数据的可读性和易操作,还是保留为好...


用户行为控制

用户的行为控制,这个的就很细粒度的行为了。小到控制用户的一个按钮的展示等,但是本质来说,都是对后端接口请求的限制?。比如,你请求一个列表,但是你没有权限,那么你就请求不了,报 401 的错误。


聊聊在Angular项目中怎么实现权限控制?


我们可以按照需求,针对用户的不同角色,限定用户不能查看或者其他操作。但是,这样很不合理,用户可以通过 postman等工具发起请求,而不通过系统。所以,我们得--


在后端做一层限制

我们获取到后端返回的接口权限,比如接收到下面这些数据:

  1. {
  2.   code: 0,
  3.   msg: 'ok',
  4.   results: {
  5.     getUserList: {
  6.      url: '/api/get/user/list', // 当然,可以按照前后端规定返回,不一定是真实的 url ...
  7.      enable: true
  8.     },
  9.     editUser: {
  10.       url: '/api/edit/:uuid',
  11.       enable: false
  12.     }
  13.   }
  14. }

我们得到数据之后,跟前端保存的内容做比对,再按照条件控制,接口需要做对应的限制访问,而不是单纯前端判断。

  1. <!-- demo.component.html -->
  2.  
  3. <button *ngIf="userObj.editUser.enable">Edit</button>

单纯前端判断:1. 不好维护 2. 不安全,用户可以跨过浏览器请求


本文网址:https://www.zztuku.com/index.php/detail-11767.html
站长图库 - 聊聊在Angular项目中怎么实现权限控制?
申明:本文转载于《掘金社区》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐