基于 PEG.js 生成权限校验语法表达式解析器

文章目录[隐藏]

背景

用户有一系列权限,例如 Article.List,User.Edit 等,这时候如果需要进行一个带嵌套的动态权限查询就会很麻烦,如果想做成可配置的就需要语法解析,例如表达式 User.Edit or User.Modify or (User.List and Admin) 的查询。

PEG.js 简介

PEG.js is a simple parser generator for JavaScript that produces fast parsers with excellent error reporting. You can use it to process complex data or computer languages and build transformers, interpreters, compilers and other tools easily.

一个基于 JavaScript 的能让你能够轻松地建立复杂的数据或计算机程序语言分析器的表达式语法解析器。

官网在这

还一个可用的在线编辑器

实现

文档在 pegjs.org,不做说明了,直接对着代码看最清晰了:

{
    function hasAction(action) {
        return action == 'User.Modify'
    }
}

Expression
  = head: Term tail:(Blank ("or" / "OR" / "||") Blank Term Blank )* {
    return tail.reduce(function(result, element) {
        return result || element[3];
    }, head);
  }

Term
  = head:Factor tail: (Blank ("and" / "AND" / "&&") Blank Factor Blank )* {
    return tail.reduce(function(result, element) {
      return result && element[3];
    }, head);
  }

Factor
  = "(" Blank expr:Expression Blank ")" { return expr; }
  / Blank expr:Label { return hasAction(expr); }

Label "label"
  = [0-9a-zA-Z_\-.]+ { return text();}

Blank "whitespace"
  = [ \t\n\r]*

打开 编辑器 ,将代码贴到左面,右面输入表达式就可以查看效果了,示例代码中的用户只具有 User.Modify 权限,可以将此处修改成 ajax 获取动作列表。

测试一个表达式 User.Edit or User.Modify or (User.List and Admin)

完美

All Done.

如果对 PEG.js 感兴趣,可以继续阅读官网文档。

Recent Posts

[转]目前国内可用Docker镜像源汇总

在国内使用 Docker 的朋…

4 天 之前

五分钟搞懂MCP是什么

首先本文的面向对象是开发人员,…

1 周 之前

ShardingSphere 更新 5.5.2 后找不到数据表

典型现象就是没有配置在分表规则…

4 周 之前

WSL+Tesla P40显卡 CUDA 不可用

基于 WSL 访问显卡时的一些…

2 月 之前

FreqTrade 量化交易超跌抄底策略

分享一个交易策略:当价格在过去…

4 月 之前

如何安全取回 GitHub 存储的 Action Secrets

在GitHub的使用过程中,存…

6 月 之前