Gemfire 9.3 Pulse中'where'子句查询权限异常问题
解决GemFire 9.3升级后查询
hostname字段的权限异常问题 我来帮你搞定这个升级后的权限坑——GemFire 9.3在安全权限控制上做了明显的强化,尤其是针对实体对象属性的访问权限校验,这就是你遇到问题的核心原因。
问题根源
在GemFire 9.1中,当你执行OQL查询访问实体字段(比如hostname)时,系统默认会允许通过反射调用对应的getHostname() getter方法,不会单独触发权限校验。但9.3版本开始,查询时会对每个字段对应的getter方法单独检查权限,哪怕你已经授权了Region的DATA:READ权限,也得额外给getter方法开权限。
具体解决步骤
1. 在自定义SecurityManager的authorize方法中添加授权逻辑
你需要在重写的authorize方法里,识别出对getHostname方法的READ请求并允许通过。示例代码如下:
@Override public void authorize(ResourcePermission permission) throws NotAuthorizedException { // 保留你原有的其他权限校验逻辑... // 新增对getHostname方法的授权判断 if (permission instanceof MethodPermission) { MethodPermission methodPerm = (MethodPermission) permission; // 匹配目标Region、getHostname方法和READ动作 if ("getHostname".equals(methodPerm.getMethodName()) && methodPerm.getResource().matches("/Region.*") && ResourcePermission.Action.READ.equals(permission.getAction())) { // 授权通过,直接返回 return; } } // 其他权限校验逻辑... }
2. (可选)通过配置文件补充权限
如果你使用了security.xml这类配置文件管理权限,还可以给对应的角色添加MethodPermission配置,确保权限覆盖更全面:
<security:permission name="org.apache.geode.security.MethodPermission"> <security:parameter name="resourceName">/Region</security:parameter> <security:parameter name="methodName">getHostname</security:parameter> <security:parameter name="action">READ</security:parameter> </security:permission>
额外提醒
如果后续查询其他字段时也出现类似的NotAuthorizedException,只需要按照同样的方式给对应的getter方法添加授权即可。另外,记得重启GemFire集群和Pulse服务,让新的权限配置生效。
内容的提问来源于stack exchange,提问作者Jesman
相关产品推荐
相关产品推荐

