Nginx 网关解决 Geoserver 图层访问控制
Geoserver 是一个流行的 GIS 图层发布软件,它默认是对所有人开放访问所有的图层,这就造成了安全问题,比如 WFS 协议可以修改图层的要素信息。要对 Geoserver 进行图层访问控制,有很多种办法,最简单的是通过 Geoserver 本身提供的图层访问权限设置,比如RBAC 基于用户角色权限进行控制,基于Geoserver 的 Jetty 容器的 IP 过滤器设置黑名单,比较复杂的是基于Geoserver插件 AuthKey 的访问控制,基于 GeoNode 程序的访问控制,后面两个不好操作。
因为 Nginx 可以代理转发 Geoserver 请求,而 Nginx 又可以充当网关,所以我们可以在 Nginx 里使用它的默认模块 ngx_http_auth_request_module 做权限控制,每当请求访问图层时,它的请求头都必须携带一个 token,然后 Nginx 先检查这个 token 是否有效,它是否有访问指定图层的权限,检测token 在一个独立的程序里进行。具体流程是用户登录时先获取一个token,这个token 关联了该用户可以访问的所有图层,然后把token 保存到 Redis 里,给它一个过期时间,当用户要访问图层时先获取到最新的token再去请求访问。
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
upstream geoserver {
server localhost:8092;
}
upstream authserver {
server localhost:9999;
}
server {
listen 8088;
server_name example.com;
location /geoserver {
proxy_pass http://geoserver;
# test 名称空间的所有图层 wms 访问时都需要认证
# 可以再加上 wfs,wmts 的链接
location /geoserver/test/wms {
auth_request /auth;
proxy_pass http://geoserver;
}
}
location =/auth {
internal;
proxy_pass_request_body off;
proxy_set_header X-Original-Method GET;
proxy_set_header X-Original-URI $request_uri;
# $http_authorization的字段默认是 "Authorization"
proxy_set_header Authorization $http_authorization;
error_page 401 = @custom-401-page;
# 认证程序的地址
proxy_pass http://authserver/auth;
}
location @custom-401-page {
return 401 'Unauthorized access, invalid token';
}
}
}