蓝凌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 配置,权限不正确排查是否被其他业务模块覆盖。

相关推荐
Remember_9932 小时前
【LeetCode精选算法】滑动窗口专题一
java·数据结构·算法·leetcode·哈希算法
开开心心就好2 小时前
音频编辑工具,多端支持基础剪辑易操作
java·网络·windows·java-ee·电脑·maven·excel
此生只爱蛋2 小时前
【Redis】持久化
数据库·redis
凯子坚持 c2 小时前
Protocol Buffers C++ 进阶数据类型与应用逻辑深度解析
java·服务器·c++
黎雁·泠崖2 小时前
Java面向对象:对象内存图+成员与局部变量
java·开发语言
窗边鸟2 小时前
小白日记之java方法(java复习)
java·学习
burning_maple3 小时前
redis笔记
数据库·redis·笔记
oh LAN3 小时前
提升性能:数据库与 Druid 连接池优化指南
数据库·mysql
砚边数影3 小时前
AI数学基础(一):线性代数核心,向量/矩阵运算的Java实现
java·数据库·人工智能·线性代数·矩阵·ai编程·金仓数据库