Koa-Authz is an authorization middleware for Koa, it's based on Node-Casbin: https://github.com/casbin/node-casbin.
npm install casbin@2 koa-authz@2 --savenpm install casbin@3 koa-authz@3 --saveconstcasbin=require('casbin')constKoa=require('koa')constapp=newKoa()constauthz=require('koa-authz')// responseapp.use(async(ctx,next)=>{conststart=newDate()awaitnext()console.log(newDate()-start)})// use authz middlewareapp.use(authz({newEnforcer: async()=>{// load the casbin model and policy from files, database is also supported.constenforcer=awaitcasbin.newEnforcer('authz_model.conf','authz_policy.csv')returnenforcer}}))// reload routesconstrouter=require('koa-router')({prefix: '/user'})router.get('/',(ctx)=>{ctx.body={name: 'Chalin',age: 26}})router.put('/',(ctx)=>{ctx.body={status: 'success'}})app.use(router.routes(),router.allowedMethods())app.listen(3000)This package provides BasicAuthorizer, it uses HTTP Basic Authentication as the authentication method.
If you want to use another authentication method like OAuth, you needs to extends BasicAuthorizer as below:
classMyAuthorizerextendsBasicAuthorizer{// override functiongetUserName(){const{ username }=this.ctx.state.userreturnusername}}app.use(authz({newEnforcer: async()=>{// load the casbin model and policy from files, database is also supported.constenforcer=awaitcasbin.newEnforcer('examples/authz_model.conf','examples/authz_policy.csv')returnenforcer},authorizer: (ctx,option)=>newMyAuthorizer(ctx,option)}))The authorization determines a request based on {subject, object, action}, which means what subject can perform what action on what object. In this plugin, the meanings are:
subject: the logged-on user nameobject: the URL path for the web resource like "dataset1/item1"action: HTTP method like GET, POST, PUT, DELETE, or the high-level actions you defined like "read-file", "write-blog"
For how to write authorization policy and other details, please refer to the Casbin's documentation.
This project is licensed under the Apache 2.0 license.