egg商城--權限管理篇

rbac權限控制

說明

rbac主要是用來存放權限的,全稱叫作基於角色權限控制mysql

思路

  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.jssql

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,因此npm

app.model.Role.hasMany(app.model.User, { as: 'user' });
複製代碼

app\model\role.jsbash

'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

app.model.User.belongsTo(app.model.Role, { as: 'role' });
複製代碼

app\model\user.jsasync

'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

自關聯查詢,因此post

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歸屬,因此ui

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;
  }
複製代碼

相關文章
相關標籤/搜索