基于 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 感兴趣,可以继续阅读官网文档。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注