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

相关推荐
最强小杰6 小时前
claude-opus-5.5 API 接入教程:anthropic-version 头、tools 定义、流式事件格式三个常见问题全部梳理,收藏备用
java·服务器·网络·ai
Cc.Y6 小时前
Java零基础入门:方法(函数)深度掌握
java·开发语言
2501_933670796 小时前
2027届大数据管理与应用求职数字化转型顾问:项目、SQL、业务理解怎么排优先级
数据库·sql
奋发向前wcx6 小时前
CSP-J复赛模拟赛1 王晨旭补题 2026.10.2
java·开发语言
奕鼎竜瑆7 小时前
Chrome 插件开发实战指南:从入门到发布
前端·chrome
广州华水科技7 小时前
水库北斗GNSS变形监测系统及单北斗形变监测一体机应用解析
前端
卓怡学长7 小时前
w192基于springboot“考研情报站”微信小程序设计与实现
java·spring boot·spring·微信小程序·intellij-idea
东方护航数据恢复(深圳)7 小时前
物流案例:勒索病毒 Mallox 加密 ERP 数据库,旧备份 + 残留页重组实录【东方护航数据恢复深圳店】
数据库·数据恢复·勒索病毒·二次开盘·开盘·数据镜像
wuminyu7 小时前
JEP491中synchronized关键字引发的平台线程钉住解决方法简介
java·linux·c语言·jvm·c++
.Hypocritical.7 小时前
Redis从入门到实战:核心原理、场景落地与避坑指南
数据库·redis·缓存