LiZheGuang / server-images

koa server test

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SERVER-IMAGES SUPER DEMO

desc: koa koa-roter koa-body test 练习 Node 与 KOA 项目

实现的功能

  • 路由 ✅
    • 路由模块化 ✅
  • 数据库操作与链接 ✅
  • koa-body ✅
  • login ✅
  • 创建用户表与用户信息 ✅
    • 用户信息以及 uuid ✅
  • jwt 设计中间件进行校验
  • 中间件 ✅
  • view 文件支持 EJS 模板
  • RBAC权限模型
    • role 角色 ✅
    • permission 权限 ✅
    • user_role 用户身份对应角色 ✅
    • role_permission 角色对应权限

用户身份权限API

/users
用户列表

[
  {
      "id": 1,
      "userId": 1,
      "roleId": 1,
      "username": "admin1",
      "uuid": "4775b101-89c9-6704-66b5-fb5eba30c742",
      "role_name": "admin",
      "permissions": "1,2,3,4"
  }
] 

/users/:userid

用户详情

{
    "id": 1,
    "userId": 1,
    "roleId": 1,
    "username": "admin1",
    "uuid": "4775b101-89c9-6704-66b5-fb5eba30c742",
    "role_name": "admin",
    "permissions": "1,2,3,4",
    "permission_users": [
        {
            "id": 1,
            "name": "create",
            "description": "Can create new records"
        },
        {
            "id": 2,
            "name": "read",
            "description": "Can read existing records"
        },
        {
            "id": 3,
            "name": "update",
            "description": "Can update existing records"
        },
        {
            "id": 4,
            "name": "delete",
            "description": "Can delete existing records"
        }
    ]
}

POST:/addPerminssion

@body:

  • permissionName:String
  • detail:String

增加权限

JWT 中间件实现

可以使用 koa-router 库来构建路由,并为需要进行身份验证的路由应用中间件。以下是一个示例:

const Koa = require("koa");
const Router = require("koa-router");
const jwt = require("jsonwebtoken");

const app = new Koa();
const router = new Router();
const port = process.env.PORT || 3000;
const secret = "my_secret"; // 密钥

function verifyJwt(ctx, next) {
  const authHeader = ctx.request.headers.authorization; // 获取Authorization头部

  if (!authHeader) {
    ctx.throw(401, "Authorization header required");
  }

  const parts = authHeader.split(" ");
  const scheme = parts[0];
  const token = parts[1];

  if (!/^Bearer$/i.test(scheme)) {
    // 验证Bearer认证方案
    ctx.throw(401, "Invalid Authorization header format");
  }

  try {
    const decoded = jwt.verify(token, secret); // 验证JWT
    ctx.state.user = decoded;
    return next(); // 调用下一个中间件
  } catch (err) {
    console.error(err);
    ctx.throw(401, err.message);
  }
}

// 需要进行身份验证的路由
router.get("/profile", verifyJwt, async (ctx) => {
  ctx.body = { message: "Hello, " + ctx.state.user.name };
});

// 不需要进行身份验证的路由
router.get("/public", async (ctx) => {
  ctx.body = { message: "This is a public page" };
});

app.use(router.routes());
app.listen(port, () => {
  console.log(`Server is listening on port ${port}`);
});

在这个示例中,首先定义了一个名为 verifyJwt 的中间件函数用于身份验证,然后使用 koa-router 中的.get 方法定义了两个路由:一个需要进行身份验证,一个不需要进行身份验证。 需要进行身份验证的路由使用了 verifyJwt 中间件进行身份验证。不需要进行身份验证的路由没有使用任何中间件。 将路由添加到路由器后,使用 app.use(router.routes())将路由器添加到应用中。 需要注意的是,koa-router 库提供了更强大的路由功能,你可以根据自己的需求进行路由的定义和使用。同时,建议将密钥存储在配置文件或环境变量中,以避免硬编码敏感信息。

About

koa server test


Languages

Language:EJS 45.3%Language:JavaScript 28.3%Language:CSS 26.4%