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

相关推荐
时间静止不是简史2 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
m0_敲代码的彭于晏1685 小时前
Vercel 前端部署平台深度评测
前端
2301_32241428045 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
怕浪猫6 小时前
外包和大厂的前端代码,差在凌晨三点
前端·面试·github
m0_敲代码的彭于晏1687 小时前
Vercel 前端部署与全栈开发实战指南
前端·状态模式
徐小夕7 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
贾伟康7 小时前
【化学实验室|17】HarmonyOS ArkTS 亮暗色与视觉令牌实战:集中颜色、间距和交互状态避免页面割裂
前端·移动开发·harmonyos·arkts·arkui
金銀銅鐵7 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工8 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
Csvn8 小时前
SSR/SSG/ISR(上):峡谷与渲染策略的时间预算
前端