蓝凌EKP产品:主文档权限机制浅析

在 EKP 二次开发中,权限机制 是绕不开的一环。

很多同学做到一半会发现:

  • 能进页面,但看不到数据

  • 列表有数据,点进去却 403

  • 编辑按钮莫名其妙消失

  • 超级管理员一切正常,普通用户全翻车

本文将结合实际项目,完整讲清楚一套"主文档级权限机制"的落地方案,包括:

  • 可阅读者 / 可编辑者的实现

  • 请求拦截 & 数据过滤的核心原理

  • design.xml 的关键配置与踩坑点


一、权限机制能解决什么问题?

本文实现的目标是:

主文档支持配置「可阅读者」「可编辑者」权限,并在系统层面自动生效

典型效果:

  • 草稿状态:只有起草人可看、可改

  • 审批中:流程参与人可读

  • 审批通过后:

    • 若设置了可阅读者 → 只有指定人员能看

    • 若设置了可编辑者 → 只有指定人员能编辑


二、整体实现思路(先看这个很重要)

权限机制 ≠ 只是页面控制,它本质分两层:

1️⃣ 请求拦截(Request Intercept)

👉 用户有没有资格 访问这个 URL

  • 控制:新建 / 编辑 / 查看 / 删除

  • 位置:design.xml -> request / query

2️⃣ 数据过滤(Data Filter)

👉 用户能不能 看到某一条数据

  • 控制:列表、详情页数据是否返回

  • 位置:design.xml -> filter

⚠️ 注意

超级管理员 不会被拦截,也不会被过滤,测试权限一定别用 admin!


三、部署步骤(核心实战部分)

1️⃣ Form 层:继承权限 Form

主文档 Form 必须继承:

复制代码
com.landray.kmss.sys.right.interfaces.ExtendAuthForm

示例:

复制代码
public class YwgTestMainForm extends ExtendAuthForm {
    ...
}

2️⃣ Model 层:继承权限 Model

主文档 Model 必须继承:

复制代码
com.landray.kmss.sys.right.interfaces.ExtendAuthModel

示例:

复制代码
public class YwgTestMain extends ExtendAuthModel {
    ...
}

📌 说明

ExtendAuthModel 内部已经定义了权限相关的基础能力,这是权限生效的前提。


3️⃣ hbm.xml:增加权限相关字段

3.1 所有人可阅读标记
复制代码
<property
    name="authReaderFlag"
    column="auth_reader_flag"
    length="1" />
3.2 可阅读者 / 可编辑者(多对多)
复制代码
<!-- 可阅读者 -->
<bag name="authReaders" table="ywg_test_main_readers">
    <key column="fd_doc_id" />
    <many-to-many
        class="com.landray.kmss.sys.organization.model.SysOrgElement"
        column="fd_org_id" />
</bag>

<!-- 可编辑者 -->
<bag name="authEditors" table="ywg_test_main_editors">
    <key column="fd_doc_id" />
    <many-to-many
        class="com.landray.kmss.sys.organization.model.SysOrgElement"
        column="fd_org_id" />
</bag>

⚠️ 表名一定要自己模块唯一,否则必翻车


4️⃣ 数据字典:声明权限字段

复制代码
<listProperty
    name="authReaders"
    messageKey="ywg-test:ywgTestMain.authReaders"
    type="com.landray.kmss.sys.organization.model.SysOrgElement"
    table="ywg_test_main_reader" />

<listProperty
    name="authEditors"
    messageKey="ywg-test:ywgTestMain.authEditors"
    type="com.landray.kmss.sys.organization.model.SysOrgElement"
    table="ywg_test_main_editor" />

5️⃣ 资源文件:补齐文案

复制代码
ywgTestMain.authReaderFlag=所有人可阅读
ywgTestMain.authReaders=可阅读者
ywgTestMain.authEditors=可编辑者

6️⃣ edit / view 页面:引入权限组件

edit 页面
复制代码
<c:import url="/sys/right/import/right_edit.jsp">
    <c:param name="formName" value="ywgTestMainForm"/>
    <c:param name="moduleModelName"
        value="com.landray.kmss.ywg.test.model.YwgTestMain"/>
</c:import>
view 页面
复制代码
<c:import url="/sys/right/import/right_view.jsp">
    <c:param name="formName" value="ywgTestMainForm"/>
    <c:param name="moduleModelName"
        value="com.landray.kmss.ywg.test.model.YwgTestMain"/>
</c:import>

四、design.xml:权限的"灵魂所在"

1️⃣ 模块与角色定义

复制代码
<module
    urlPrefix="/ywg/test/"
    messageKey="ywg-test:module.ywg.test"
    defaultValidator="roleValidator(role=ROLE_YWGTEST_DEFAULT)">

    <roles>
        ROLE_YWGTEST_DEFAULT;
        ROLE_YWGTESTMAIN_ADD;
        ROLE_YWGTESTMAIN_VIEW;
        ROLE_YWGTESTMAIN_EDIT;
        ROLE_YWGTESTMAIN_DELETE
    </roles>

2️⃣ 请求拦截(query)

复制代码
<!-- 查看 -->
<query
    queryString="method=view"
    validator="authFieldValidator(type=SYS_READER)" />

<!-- 编辑 -->
<query
    queryString="method=edit|update"
    validator="authFieldValidator(type=SYS_EDITOR)" />

👉 含义很直白:

  • SYS_READER:可读权限

  • SYS_EDITOR:可编辑权限


3️⃣ 数据过滤(filter)

复制代码
<filters modelName="com.landray.kmss.ywg.test.model.YwgTestMain">

    <filter type="SYS_READER"
        expression="authFieldFilter(field=authAllReaders.fdId)" />

    <filter type="SYS_READER"
        expression="flagFieldFilter(field=authReaderFlag,value=1)" />

    <filter type="SYS_EDITOR"
        expression="authFieldFilter(field=authAllEditors.fdId)" />

</filters>

📌 这一步,决定了 列表能不能看到数据


五、权限机制的几个关键认知

1️⃣ 按钮显示 ≠ 权限生效

按钮是否显示,最终还是靠 URL 校验

所以页面按钮一定要配合 kmss:auth 使用。

2️⃣ 查询必须走 BaseDao

否则:

复制代码
findList() / findPage()

的权限过滤 不会生效

3️⃣ 超级管理员是"假象制造者"

权限测试阶段请远离 admin


六、总结一句话

EKP的 权限机制的本质 = design.xml 驱动的请求拦截 + 数据过滤,排查权限重点查看design.xml 配置,权限不正确排查是否被其他业务模块覆盖。

相关推荐
Web打印1 天前
Phpask(php集成环境)之15 phpstudy转移到phpask
数据库·mysql
LaughingZhu1 天前
Product Hunt 每日热榜 | 2026-02-14
数据库·人工智能·经验分享·神经网络·搜索引擎·chatgpt
欧恩意1 天前
【Tools】Java反汇编工具推荐
java·汇编
软件派1 天前
近两年国外主流数据库深度解析:从技术特性到场景适配
数据库
寻星探路1 天前
【JVM 终极通关指南】万字长文从底层到实战全维度深度拆解 Java 虚拟机
java·开发语言·jvm·人工智能·python·算法·ai
Elastic 中国社区官方博客1 天前
DevRel 通讯 — 2026 年 2 月
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·jina
lbb 小魔仙1 天前
【Java】Java 实战项目:手把手教你写一个电商订单系统
android·java·python
星河耀银海1 天前
Java安全开发实战:从代码防护到架构安全
java·安全·架构
青云交1 天前
Java 大视界 -- 基于 Java 的大数据可视化在城市水资源管理与节水策略制定中的应用
java·java 大数据·java 大数据可视化·城市水资源管理·spark 数据清洗·echarts 热力图·管网漏损控制
岱宗夫up1 天前
FastAPI入门(上篇):快速构建高性能Python Web API
开发语言·前端·python·fastapi