egg-auths
Auths 是 eggjs 的一个插件,主要用于完成用户认证(Authentication)和授权(Authorization),相关的 API 和模块主要参考 Apache Shiro 来设计,支持粗粒度的基于角色来控制资源的访问,也支持细粒度的基于资源的权限访问控制。目前的设计上,角色和权限的数据源(Realm)为数据库,使用 egg-sequelize 作为 ORM,用户身份和凭证信息持久化到 egg 的 session
。
依赖说明
依赖的 egg 版本
egg-auths 版本 | egg 2.x |
---|---|
1.x | 😁 |
依赖的插件
- egg-sequelize
Install
# depend egg-sequelize
npm i egg-auths egg-sequelize
Configuration
- 配置 egg 的
plugin.js
// application/config/plugin.js
sequelize: {
enable: true,
package: 'egg-sequelize',
},
auths: {
enable: true,
package: 'egg-auths'
}
- 配置 egg 的
config.default.js
// application/config/config.default.js
config.sequelize = {
dialect: 'mysql',
host: '127.0.0.1',
port: 3306,
database: 'test',
username: 'root',
password: '********',
// 插件带有数据库的 ORM model 定义
// 真实环境请将该目录拷贝到 application/app/model 下,并修改 baseDir 的值
// 参考 egg-sequelize
baseDir: '../node_modules/egg-auths/app/model'
}
config.auths = {
// 如果没有自定义 auths 中的某些模块的需求,则可以仅为空对象
}
- 同步 Model 到 DB
// application/app.js
module.exports = app => {
if (app.config.env === 'local' || app.config.env === 'unittest') {
app.beforeStart(async () => {
await app.model.sync();
});
}
};
参考 egg-sequelize,在生产环境下应该使用 sequelize-cli.
Usage
- 在路由中使用中间件
// application/app/router.js
// 引入依赖
const RBACAuth = require('egg-auths/lib/index')
module.exports = app => {
const { router, controller } = app;
// 初始化一个实例
const rbac = new RBACAuth({
// 这里可以定义认证或者鉴权失败的相关 HTTP Response,详细配置查看 API 文档的 RBACAuth
})
// 在特定路由中使用
router.get('/admin', rbac.checkRoles(['admin']), controller.admin.index)
router.get('/orders', rbac.checkRoles(['admin','ceo']), controller.admin.order)
router.get('/users', rbac.checkPermissions(['admin:user']), controller.admin.order)
router.get('/profile', rbac.checkLogin(), controller.admin.order)
}
- 在程序中(
controller
,service
)使用 API 验证
// application/app/controller/admin.js
const Controller = require('egg').Controller;
class AdminController extends Controller {
async index () {
let { ctx } = this
let subject = await ctx.getSubject()
subject.hasRoles(['admin','ceo'])
subject.hasPermissions(['admin:user'])
subject.isLogined // true or false
}
}