自定义SQL会话启动/停止脚本

从版本2.1.4开始,geoserver支持自定义SQL脚本,每次geoserver从连接池获取连接时,以及每次会话返回池时,都可以运行这些脚本。

这些脚本可以通过环境变量的扩展进行参数化,而环境变量又可以通过与 SLD中的变量替换 .

除了通过请求提供的参数外, GSUSER 变量保证包含当前的geoserver用户,如果没有可用的身份验证,则为空。如果SQL会话脚本用于提供对数据库访问的严格控制,则此功能非常有用。

SQL脚本可以使用 ${{variableName, defaultValue}} 语法,例如,以下内容将当前数据库用户更改为与geoserver当前用户相同的用户,或者 geoserver 如果没有用户通过身份验证

设置会话授权$gsuser,geoserver_

使用SQL会话脚本控制数据库级别的授权

geoserver通过连接池连接到数据库,使用与连接池设置中指定的用户相同的权限。在提供各种服务和表的设置中,连接池用户必须具有相当大的权限集,例如表选择(WMS)、表插入/更新/删除(WFS-T)甚至表创建(通过restconfig上载数据、WPS导入过程以及利用直接数据库连接)。

用户可以通过geoserver安全子系统进行控制,但在高安全设置中,这可能被认为不够,因此最好使用数据库级访问控制。在这些设置中,通常连接池用户具有有限的访问权限,例如简单的只读访问权限,同时允许特定用户执行更多操作。

设置此类解决方案时,请记住以下准则:

  • 连接池用户必须能够访问所有表元数据,而不管它是否能够对表执行选择(字典表/描述功能必须始终可访问)

  • 连接池必须看到表和视图的每一列,换句话说,表的结构不能随着当前用户的更改而更改。

  • 数据库用户和geoserver用户必须与一些外部工具保持同步,geoserver不提供现成的工具

  • 在Geoserver启动期间,代码将访问数据库以执行一些健全性检查,此时在Geoserver中没有经过身份验证的用户,因此代码将在指定为“默认值”的任何用户下运行 GSUSER 变量。

  • 管理地理服务器的用户(通常 admin ,但它可以重命名,其他给定管理角色的用户也必须是数据库用户,geoserver gui上的所有管理访问都将由该特定用户控制会话。

典型用例:

  • 仅向必须使用WFS-T的用户授予插入/更新/删除权限

  • 仅允许管理员创建新表

  • 通过使用动态SQL视图来限制用户可以看到表中的哪些行,同时考虑到当前用户来决定返回哪些行

为了以防万一,如果我们希望PostgreSQL会话使用当前的geoserver用户凭据运行,将使用以下脚本:

../../_images/postgresqlSession.png

为PostgreSQL设置会话授权

第一个命令使数据库会话使用当前的geoserver用户或 geoserver 如果没有可用的身份验证(匿名用户或启动情况)。第二个命令将会话重置为连接池用户的权限。