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

相关推荐
.痞老板.9 分钟前
java ee--多线程(进阶)
java·java-ee
treasure14032 分钟前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
可乐ea33 分钟前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
深入云栈2 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
jay神2 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
屏什么录2 小时前
长时间录屏中途崩溃:MP4 打不开的 6 种救回方案与参数设置
前端·音视频开发
阿义有问题2 小时前
MySQL 迁移达梦全流程实战:DTS 七步图解 + 对象名全大写适配(附踩坑清单)
数据库
code_Bo2 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen2 小时前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能
wang_shu_mo_ran3 小时前
MyBatis 从入门到进阶(一)
java·spring·mybatis