Angular 项目实现权限控制

2022-04-15 14:06:44 浏览数 (1)

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天。

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

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

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

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

  1. 对用户登陆的菜单做控制
  2. 对用户的行为做限制

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

菜单路由控制

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

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

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

代码语言:javascript复制
// 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
      }
    ]
  },
  // ...
]

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

代码语言:javascript复制
<!-- 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 字段 - 菜单是否展开的标识

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

代码语言:javascript复制
// 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
      }
    ]
  },
  // ...
]

也许你会有疑问

0 人点赞