基于 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 容器非 root 用户监听 80 端口

起因是基于 CentOS 的 …

1 年 之前

基于 Docker 定时打印文件

先说背景,喷墨打印机有个很大的…

2 年 之前

Java 运行时反射获取来自继承的泛型

背景 正常情况下 Java 的…

2 年 之前

Java 基于 ByteBuddy 重写系统当前时间

背景 一般单元测试时总会有些代…

2 年 之前

华硕 B450F-Gaming 主板 I211-AT 网卡驱动安装

事情起因是买了块华硕的 ROG…

3 年 之前

PHP 安装 Memcached 扩展

登录服务器挨步执行: # su…

3 年 之前