Angular 项目实现权限控制

简介: 上一篇文章我们讲到了 Angular 组件通信。本文我们讲讲,在项目开发中,你是否会遇到这样的需求

image.png


一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情


上一篇文章我们讲到了 Angular 组件通信。本文我们讲讲,在项目开发中,你是否会遇到这样的需求:


请根据用户登陆,限制其访问的内容。


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


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


  1. 对用户登陆的菜单做控制


  1. 对用户的行为做限制


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


菜单路由控制



image.png


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


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


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


// app-routing.module.ts
const routes: Routes = [
  {
    path: 'user-manage',
    component: AuthLayoutComponent, // 通过鉴权的组件
    children: [
      {
        path: '',
        redirectTo: 'user',
        pathMatch: 'full'
      },
      {
        path: 'user', // 用户列表
        component: UserComponent
      },
      {
        path: 'user/detail/:uuid', // 用户详情,类似这种不会出现在菜单里面
        component: UserDetailComponent
      },
      {
        path: 'department', // 部门列表
        component: DepartmentComponent
      }
    ]
  },
  // ...
]
复制代码


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


<!-- demo.component.html -->
<ul nz-menu nzMode="inline" [nzInlineCollapsed]="isCollapsed">
  <li *ngFor="let submenu of menu_data" nz-submenu [nzTitle]="isCollapsed ? '' : submenu.title" [nzIcon]="submenu.icon"
    [nzOpen]="submenu.is_open" (nzOpenChange)="selectMenu(submenu)">
    <ul>
      <li *ngFor="let child of submenu?.children" nz-menu-item nzMatchRouter>
        <a [routerLink]="['/' + child.url]">{{ child.title }}</a>
      </li>
    </ul>
  </li>
</ul>
复制代码


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


  • title 字段 - 菜单的标题
  • url 字段 - 菜单的路由,对应 app-routing.module.ts 中的完整的 path
  • icon 字段 - 标题前的小图标,二级标题没有
  • is_open 字段 - 菜单是否展开的标识


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


// demo.component.ts
public menu_data:any = [
  {
    title: "成员管理",
    url: "user-manage",
    icon: "user-switch", // 这里是用了 angular ant design 的图标
    is_open: false,
    children: [
      {
        title: "用户",
        url: "user-manage/user",
        icon: undefined,
        is_open: false
      },
      {
        title: "部门",
        url: "user-manage/department",
        icon: undefined,
        is_open: false
      }
    ]
  },
  // ...
]
复制代码


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


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


用户行为控制



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


image.png


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


在后端做一层限制


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


{
  code: 0,
  msg: 'ok',
  results: {
    getUserList: {
     url: '/api/get/user/list', // 当然,可以按照前后端规定返回,不一定是真实的 url ...
     enable: true
    },
    editUser: {
      url: '/api/edit/:uuid',
      enable: false
    }
  }
}
复制代码


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


<!-- demo.component.html -->
<button *ngIf="userObj.editUser.enable">Edit</button>
复制代码


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



相关文章
|
7月前
|
开发者
Angular Schematics 实战 - 项目根目录新建一个文件
Angular Schematics 实战 - 项目根目录新建一个文件
30 0
|
7月前
|
JavaScript
Angular 项目中 angular.json builder 字段的可选项介绍
Angular 项目中 angular.json builder 字段的可选项介绍
45 0
|
12天前
|
C++
【angular】启动项目和路由配置
【angular】启动项目和路由配置
19 1
|
5月前
|
JavaScript
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
|
27天前
设置Open in Terminal快捷键Alt+Shift+Z,方便angular项目的各种命令输入(多任务状态下)
设置Open in Terminal快捷键Alt+Shift+Z,方便angular项目的各种命令输入(多任务状态下)
|
27天前
|
JavaScript 前端开发 开发工具
Angular 项目中一个 index.d.ts 文件的具体例子介绍
Angular 项目中一个 index.d.ts 文件的具体例子介绍
16 0
|
1月前
|
JavaScript 前端开发 开发者
Angular 项目里 tsconfig.schematics.json 文件的作用
Angular 项目里 tsconfig.schematics.json 文件的作用
9 0
|
8月前
Angular 项目中导入 styles 文件到 Component 中的一些技巧
Angular 项目中导入 styles 文件到 Component 中的一些技巧
40 0
|
4月前
|
存储 搜索推荐 API
通过项目中的实际例子,介绍 LocalStorage 在 Angular 开发中的使用场景
通过项目中的实际例子,介绍 LocalStorage 在 Angular 开发中的使用场景
39 0
|
5月前
|
应用服务中间件 nginx
Angular打包构建项目服务器运行runtime.js、polyfills.js、vendor.js报错net::ERR_ABORTED 404 (Not Found),build修改为相对路径./
Angular打包构建项目服务器运行runtime.js、polyfills.js、vendor.js报错net::ERR_ABORTED 404 (Not Found),build修改为相对路径./

热门文章

最新文章