example for egg-rbac plugin
$ npm i
$ npm run dev
$ open http://localhost:7001/
- 安装插件
js # npm i --save egg-rbac
- 启用插件
// {app_root}/config/plugin.js
exports.rbac = {
enable: true,
package: 'egg-rbac',
};
- 插件配置(更多信息查看config.default.js)
config.rbac = {
initOnStart: true, // default false
/**
* @param {object} ctx - egg context object
* @return {object} promise, if resolve data is falsy, no role
*/
async getRoleName(ctx) {
if (ctx.session.user && ctx.session.user.role.name) {
return Promise.resolve(ctx.session.user.role.name);
}
return Promise.resolve('');
},
};
- 配置权限列表和初始角色信息
// {app_root/config/rbac.js}
'use strict';
exports.permissions = [
// action_resource
{ name: '/admin', alias: '访问文章管理' },
];
exports.roles = [
{ name: 'user', alias: '普通用户', grants: [ '/admin', '/admin/tag', '/admin/collect' ] },
];
配置中的 getRoleName 函数用于返回当前用户的角色名称,egg-rbac 内部中间件通过调用 getRoleName 获得角色名称后创建 Role 对象,并且绑定到 context(ctx) 上面。
- 通过默认提供的中间件方法进行判断处理
app.get('/admin', app.rbac.can('query_admin'), 'home.index');
-
自定义中间件,请参考本项目代码
-
调用 ctx.role.can() 进行判断
ctx.role.can('/admin');
app.rbac 对象上面有通用方法用于创建角色、修改角色权限
例子:
//{app_root/app/controller/home.js}
const role = await app.rbac.newRole({ name: body.name, alias: body.alias, grants: [] });
if (body.removeArr && body.removeArr.length > 0) {
await app.rbac.removePermissions(body.id, body.removeArr);
}
if (body.addArr && body.addArr.length > 0) {
await app.rbac.addPermission(body.id, body.addArr);
}