wms系统用户管理功能总结

453 阅读3分钟

1.wms的权限分层

第一层是admin管理员,管理员有管理所有用户和角色的功能,但没有访问其他页面的功能,上个release做的就是管理员管理页面。

第二层是角色,角色分为客户经理、总监、用户。对于不同的角色有不同的功能模块可以操作,所以对于用户角色我们需要鉴权操作。

第三层就是用户了,每个用户创建的时候都会被分配一个角色,不同的角色对应不同的权限,所以这个用户也有了相关权限。

2.wms的权限功能

由于不同的角色有不同的权限,这些权限可以分为路由权限,菜单权限,功能权限。

路由权限,一个路由对应一个功能模块,比如管理员只能访问用户管理页面,其他功能模块没有权限。

菜单权限,一个角色在主页面的时候可以展示哪些菜单,隐藏哪些菜单,这个也需要用权限来控制。

功能权限,比如某个按钮对应的某个操作只能由某个角色才能使用,那么这一个功能就属于功能权限。

要实现这些权限我们需要有一套权限控制系统

首先我在开发时所想的权限控制实现是将角色映射到权限上,也就是说某个路由哪些角色可以访问,某个功能哪些角色可以访问。后来发现这样写并不灵活,这样写的问题是我只考虑到了路由权限,菜单权限和功能权限我没考虑到,如果是功能对应角色的话那么每增加一个权限功能就要增加一个对应的功能权限数组,这样写很不灵活。

后来的实现是将功能映射到角色上,也就是定义角色拥有哪些权限,这样写相对就比较灵活了,每一个权限不管是路由,功能还是菜单都只需要定义一个资源的KEY,然后加到角色的映射表中即可。其实这样做还是有一定的问题,就是如果权限太多,那么这几块权限都放在一个映射表下很难管理和查找。但目前的wms系统不考虑做大的情况,所以这种方法适合。

// 角色组
import {
  ADMIN, CLIENT, MANAGER, DIRECTOR,
} from '../user-groups';

// 路由权限
import {
  PORTFOLIO,
  PROFILE,
  USER_MANAGEMENT,
  PRODUCTS_HOLD,
  PRODUCTS_RESEARCH,
  PRODUCTS_SALES,
  PRODUCTS_CUSTOMER,
} from './router';
// 功能权限
import { SELECT_CUSTOMER } from './function';
// 菜单权限
import { LAYOUT_NAV } from './menu';

// 管理员权限
const ADMIN_PERMISSION = [
  USER_MANAGEMENT,
];

// 客户权限
const CLIENT_PERMISSION = [
  PORTFOLIO,
  PROFILE,
  LAYOUT_NAV,
  PRODUCTS_HOLD,
  PRODUCTS_RESEARCH,
  PRODUCTS_SALES,
];

// 客户经理权限
const MANAGER_PERMISSION = [
  PORTFOLIO,
  PROFILE,
  SELECT_CUSTOMER,
  LAYOUT_NAV,
  PRODUCTS_HOLD,
  PRODUCTS_RESEARCH,
  PRODUCTS_SALES,
  PRODUCTS_CUSTOMER,
];

// 总监权限
const DIRECTOR_PERMISSION = [
  PORTFOLIO,
  PROFILE,
  LAYOUT_NAV,
  PRODUCTS_RESEARCH,
  PRODUCTS_SALES,
  PRODUCTS_CUSTOMER,
];

export const ROLE_PERMISSION_KEYS = {
  [ADMIN]: ADMIN_PERMISSION,
  [CLIENT]: CLIENT_PERMISSION,
  [MANAGER]: MANAGER_PERMISSION,
  [DIRECTOR]: DIRECTOR_PERMISSION,
};

export const DEFAULT_ROUTE = {
  [ADMIN]: '/user-management',
  [MANAGER]: '/products/hold',
  [CLIENT]: '/products/hold',
  [DIRECTOR]: '/products/sales',
};

在判断权限的时候只需要在登录的时候获取当前用户的权限code,然后在ROLE_PERMISSION_KEYS这个mapping关系中去查找即可。

3.考虑登录成功之后的页面跳转

在用户登录成功之后跳转分为两种情况下,一种是用户原本在某个路由中,由于没有权限,重定向到了登录页面,那么登录成功之后就应该跳转回那个页面。具体实现可以用一个总的高阶组件来管理路由,处理没有登录的情况,如果没有登录在跳转到登录页面之前携带当前页面的路由信息,登录完成之后根据信息返回即可。

第二种情况是原本就在登录页面,由于有不同的角色有不同的界面访问权限,可能默认界面某个角色没有权限。那么 就需要对不同的角色分配一个默认路由,也可以写成配置,根据角色来判断即可。