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