服务器模式下H2数据库TCP连接只读权限限制方法问询
H2 TCP服务器模式全局限制只读的可行方案
方案1:基于数据库用户权限控制(最灵活,推荐)
该方案可以精准控制不同用户的读写权限,不需要调整服务器全局配置,适合同时存在读写和只读访问需求的场景:
- 首先使用拥有管理员权限的账户连接到H2数据库
- 执行SQL创建只读用户:
CREATE USER read_only_user PASSWORD '自定义密码';
- 为该用户授予对应 schema 的只读权限,仅开放查询能力:
-- 授予PUBLIC schema下所有表的查询权限,如有其他schema自行替换 GRANT SELECT ON SCHEMA PUBLIC TO read_only_user; -- 如果需要仅开放指定表的查询权限,可改为如下写法 -- GRANT SELECT ON TABLE 目标表名 TO read_only_user;
- 后续所有只读场景的连接统一使用上述创建的只读用户,无论客户端URL是否携带读写参数,该用户都无法执行写入、修改、删除类操作。同时注意保管好原有高权限用户的密码,避免非授权使用。
方案2:H2 TCP服务器启动时配置全局只读(适合全实例只读场景)
如果你的H2实例不需要提供任何写入服务,可以在启动TCP服务器时直接指定只读参数,全局拦截所有写入请求:
- 启动命令添加
-readOnly参数即可,示例如下:
java -cp h2*.jar org.h2.tools.Server -tcp -tcpPort 8082 -readOnly
- 该配置生效后,整个H2实例下的所有数据库都处于只读状态,不管使用什么用户、客户端URL加什么参数,都无法执行写入操作,彻底绕过客户端侧的参数限制。
方案3:数据库文件设置系统级只读(兜底方案)
你也可以直接修改数据库物理文件的系统权限为只读,从操作系统层面拦截写入操作:
- 首先停止H2服务器,避免正在运行的写入操作损坏文件
- Linux/macOS下执行权限修改:
chmod 444 ~/source/database/database.* - Windows下找到对应数据库文件,右键属性勾选「只读」即可
- 该方案生效后,即使用户权限、服务器配置都允许写入,操作系统也会拒绝写入请求,可作为兜底的只读限制手段。
你之前了解的JDBC URL添加
ACCESS_MODE_DATA=r的方式仅为客户端侧的逻辑限制,仅能防止客户端误操作,完全可以通过移除参数绕过,不能作为安全层面的只读控制手段。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

