egg商城--权限管理篇

rbac权限控制

说明

rbac主要是用来存放权限的,全称叫做基于角色权限控制

思路

  1. 权限表中存在着url,
  2. 根据当前用户查找对应的角色
  3. 根据角色权限表,查找出权限表中的url字段
  4. 判断当前url是否与权限表中的多个url中的一个相等,
  5. 相等证明有权限仿问

数据表

  1. 角色表role
  2. 用户表user
  3. 权限表permission
  4. 角色权限表rolePermission

表与表之间的联系

  1. 角色下面有用户,角色与用户是一对多的关系
  2. 角色权限表,角色与权限是多对多的关系

建立数据表

数据库

角色表(role)

CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色id',
  `name` varchar(255) DEFAULT NULL COMMENT '标题',
  `status` int(1) DEFAULT '1' COMMENT '0:不可用,1:可用',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='角色';



复制代码

用户表(user)

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `username` varchar(255) DEFAULT NULL COMMENT '用户名',
  `password` varchar(255) DEFAULT NULL COMMENT '用户密码',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更改时间',
  `role_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

复制代码

权限表(permission)

CREATE TABLE `permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '权限id',
  `title` varchar(255) DEFAULT NULL COMMENT '标题',
  `url` varchar(255) DEFAULT NULL COMMENT '连接地址',
  `status` int(1) DEFAULT '1' COMMENT '0:不可用,1:可用',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更改时间',
  `permission_id` int(11) DEFAULT NULL COMMENT '当前表id',
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`title`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='权限';



复制代码

角色权限表(rolepermission)

CREATE TABLE `role_permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色权限id',
  `role_id` int(11) DEFAULT NULL COMMENT '角色id',
  `permission_id` int(11) DEFAULT NULL COMMENT '权限id',
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB ENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='角色权限多对多';


复制代码

创建项目

新建egg-rbac项目

egg-init egg-rbac --type=simple
cd egg-example
cnpm install
复制代码

安装依赖

cnpm install egg-sequelize mysql2 egg-view-ejs --save
复制代码

配置依赖

config\plugin.js

module.exports = {
  ejs: {
    enable: true,
    package: 'egg-view-ejs',
  },
  sequelize: {
    enable: true,
    package: 'egg-sequelize',
  },
};
复制代码

配置数据库

config\config.default.js

  config.sequelize = {
    dialect: 'mysql', // support: mysql, mariadb, postgres, mssql
    dialectOptions: {
      charset: 'utf8mb4',
    },
    database: 'eggrbac',
    host: 'localhost',
    port: '3306',
    username: 'root',
    password: '123456',
    timezone: '+08:00',
  };
复制代码

建立model

role

因为查找role的时候,想要知道这个role下面有多少个user,所以

app.model.Role.hasMany(app.model.User, { as: 'user' });
复制代码

app\model\role.js

'use strict';

module.exports = app => {
  const { INTEGER, STRING, DATE } = app.Sequelize;
  const Role = app.model.define('role', {
    id: {
      type: INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    name: {
      type: STRING,
    },
    status: {
      type: INTEGER,
    },
    created_at: DATE,
    updated_at: DATE,
  }, {
    freezeTableName: true,
  });
  Role.associate = function() {
    app.model.Role.hasMany(app.model.User, { as: 'user' });
  };
  return Role;
};


复制代码

user

因为查找user的时候,想要知道这个user归属于哪一个role,所以

app.model.User.belongsTo(app.model.Role, { as: 'role' });
复制代码

app\model\user.js

'use strict';

module.exports = app => {
  const { INTEGER, STRING, DATE } = app.Sequelize;
  const User = app.model.define('user', {
    id: {
      type: INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    username: {
      type: STRING,
    },
    password: {
      type: STRING,
    },
    created_at: DATE,
    updated_at: DATE,
    role_id: {
      type: INTEGER,
    },
  }, {
    freezeTableName: true,
  });
  User.associate = function() {
    app.model.User.belongsTo(app.model.Role, { as: 'role' });
  };
  return User;
};

复制代码

permission

自关联查询,所以

app.model.Permission.belongsTo(app.model.Permission, { as: 'permissions', foreignKey: 'permission_id' });
复制代码

app\model\permission.js

'use strict';

module.exports = app => {
  const { INTEGER, STRING, DATE } = app.Sequelize;
  const Permission = app.model.define('permission', {
    id: {
      type: INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    title: {
      type: STRING,
    },
    url: {
      type: STRING,
    },
    status: {
      type: INTEGER,
    },
    created_at: DATE,
    updated_at: DATE,
    permission_id: {
      type: INTEGER,
    },
  }, {
    freezeTableName: true,
  });
  Permission.associate = function() {
    app.model.Permission.belongsTo(app.model.Permission, { as: 'permissions', foreignKey: 'permission_id' });
  };
  return Permission;
};

复制代码

role_permission

查询role_id,permission_id归属,所以

    app.model.RolePermission.belongsTo(app.model.Role, { as: 'role' });
    app.model.RolePermission.belongsTo(app.model.Permission, { as: 'permission' });
复制代码

app\model\role_permission.js

'use strict';

module.exports = app => {
  const { INTEGER, STRING, DATE } = app.Sequelize;
  const RolePermission = app.model.define('role_permission', {
    id: {
      type: INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    role_id: {
      type: INTEGER,
    },
    permission_id: {
      type: INTEGER,
    },
    created_at: DATE,
    updated_at: DATE,
  }, {
    freezeTableName: true,
  });
  RolePermission.associate = function() {
    app.model.RolePermission.belongsTo(app.model.Role, { as: 'role' });
    app.model.RolePermission.belongsTo(app.model.Permission, { as: 'permission' });
  };
  return RolePermission;
};

复制代码

测试

app\controller\home.js

  async index() {
    const { ctx } = this;
    const data = await ctx.model.Role.findAll();
    ctx.body = data;
  }
复制代码

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值