关于如何在你的Web项目中实现对空间数据访问权限的控制(一)
Wednesday, 23 JUNE
近来一直在研究关于如何在我的WebGIS项目中实现对空间数据(已发布在GeoServer上)进行权限管理的问题。虽然到目前为止没能找到一个完美的解决方案,但通过这些天的学习与查阅资料,思路上多少有了一些进展,因此记录下来,做一个简单的小结。
1-GeoServer中的Security模块
GeoServer是一个基于J2EE基础实现的,允许用户共享和编辑地理空间数据的GIS应用服务器。——FROM GeoServer官方介绍。
其实,GeoServer的本质是一个基于JAVA实现的Web项目工程,我在项目中使用的GeoServer是一个War包版本,直接将其copy到/%TomcatHome%/WebAPP/路径下,启动Tomcat,GeoServer就如同你自己的Web项目一样,被部署在了Tomcat中。当GeoServer被部署完成后,你可以通过http://localhost:yourport(你的端口号)/geoserver进入GeoServer的控制面板。
在控制面板的左侧菜单栏中,你很容易能够找到关于GeoServer的Security设置。接下来我将简单地介绍一下对已经发布在GeoServer上的资源进行权限分配的相关概念,为了避免这篇博客成为实验报告,我会尽量减少实际操作部分的描述,主要介绍Security模块的结构与原理。
1-1 角色
在GeoServer中,角色由三个部分组成:name/parent role/key-value Pairs,其中parent role【父角色】利用了继承的概念,使得每个角色都可以拥有一个父元素,子角色能够继承父角色的所有权限,比如说某个角色A,A_a是A的子角色,A所拥有的所有权限,都能够被A_a继承,但A不一定拥有A_a的所有权限,可以理解为,二者是一个递进的关系,父元素能够访问一定权限的资源,子元素的私密性程度更高,在父元素的权限基础上,能够拥有更多的资源访问权力。
任何系统安全模块的实现都是基于分角色授权的模式。GeoServer也不例外,在GeoServer中,角色服务(role service)主要由以下三个方面实现:
- 角色表
- 授权机制
- GeoServer系统角色与应用角色之间的映射关系(包括了管理员、角色分组)
其中角色表与授权机制都和普通的安全模块一样,你可以通过控制面板中可视化设置新的角色,并将其分配给不同的用户。而GeoServer中的角色与你所设置的角色之间的关联是GeoServer角色服务的关键部分,因为只有当你所新建的角色与系统角色映射关联之后,才能够获得管理GeoServer中数据的权限。
在GeoServer中,角色映射的配置方式主要包括以下两种:
- XML (默认方式)
- JDBC 通过JDBC,针对数据库中的用户表进行权限分配(推荐方式)
一般情况下,你只需要在GeoServer控制面板上的菜单栏中选中Users/groups/Roles一栏,在相应的位置进行设置就可以实现role service的新建、修改和激活,如你需要直观地查看XML配置文件的结构,可以通过访问/%GeoServerHome%/data/security/role/{yourRoleServiceName}即可看到你设置的相关角色分配情况。
PS: 在该路径下,一共有以下三个文件:
- Config.xml: 将本地角色与系统的角色相互映射
- Roles.xml: 设置角色种类,为用户分配角色信息
- Roles.xsd: 定义service的实现模式
1-2 用户认证 Authentication
前面的部分基本上围绕着角色,用户,用户组等概念对GeoServer的授权方式进行简单介绍。但一个完整的用户权限子系统应该同时具备两个关键内容:授权和认证,所以接下来我们一起来看看GeoServer中的用户认证(Authentication)方式。
这是左侧菜单栏中Authentication-add new authentication filter中配置界面的部分截图,从截图中我们可以看出,GeoServer提供了很多种认证方式,其中包括J2EE、Form表单、HTTP Header验证等等,其中GeoServery以Form表单认证作为默认方案,具体流程如下图所示
(图源来自于http://docs.geoserver.org/stable/en/user/security/usergrouprole/interaction.html):
从图中我们能够很明显的理解GeoServer进行用户认证的大体流程,主要依托于User/Group Service和Role Service两个服务进行授权和认证,在GeoServer平台上实现了GeoServer工程中的权限控制与管理。
1-3 认证链
前面1-2节简单介绍了一下用户认证的基本概念和流程,其实在GeoServer的权限功能实现过程中,有一个非常重要的概念——认证链,这是理解整个security认证机制的关键。
所谓认证链,Authentication chain,即一种处理请求并申请相应认证的机制,其中认证机制主要包括以下几种:
- Username/password:在外接用户数据库中查找用户信息
- Browser cookie:在浏览器缓存Cookies中查找之前的认证记录
- LDAP:根据LDAP数据库进行认证
- Anonymous:无需认证
多级权限认证机制能够在GeoServer的一次运行中分别被激活:
从上图我们可以看出,在请求进入dispatchServlet之前,GeoServer首先对请求进行认证链的过滤,请求逐个通过认证链上的每一个机制,如果任意一个认证机制能够成功与请求匹配,则将请求交还到正常请求处理的路径上,分发到合适的handler上,否则返回错误信息401.
实际上,认证链过程是由两个链组成的:
a filter chain(过滤链):请求是否需要认证 →不需要→ 直接进入处理请求流程
↓
需要
↓
A provider chain(规则链):请求与那个权限认证能够匹配
PS: Filter chain过滤链存在的意义在于:
- 从request中收集用户证书
- 能够处理例如:登出(logging out)和Remember Me浏览器缓存设置等问题
- 管理Session
- 帮助规则链接受一些无需认证请求,减少请求负荷
值得注意的是:不同的Filter chain能够处理不同种类的请求,因此管理员能够为不同的用户设置相应的过滤链,需要注意的是,如果同时有多条过滤链符合请求的时候,仅取第一条符合要求的过滤链。
1-4 OWS && REST Services
前面讨论的是对角色认证后,用户角色的状态变化,而用户角色认证的结果会影响到用户在应用中所拥有访问资源和进行操作的权限分配。接下来要介绍的就是基于OWS (OpenGIS_WebService)and REST service下的认证流程,这两种风格的服务并没有session这样一个概念,所以权限认证体系要求客户端为每一次请求提供证书,但如果session存在于服务器端,则session能够用于认证。
1-4-1 OWS Service的认证链
Session:处理整合session
Basic Auth:从HTTP header中提取权限认证证书(Username && passwords)
Anonymous:处理匿名访问【游客】
1-4-2 WMS的认证链
具体流程描述:
Ⅰ GetCapabilities request
Ⅱ GetMap request for a secured layer
如上图,Basic Auth被触发,判断是否登陆,如果仍是匿名登陆(Anonymous),则返回给用户HTTP 401代码,跳转到用户登录界面,如果完成登陆,则将进入规则链,为登陆用户提供权限之内的资源与操作。
Ⅲ Service
GeoServer对于权限粒度的控制达到了service级别,能够对用户的操作(OWS和REST)进行锁定和控制,在Geoserver中主要有两Services:OWS(WFS,WMS)和RESTful Service。
- OWS服务
路径:%GeoServerHome%/data/security/services.properties
e.g:wfs.Transaction = ROLE_WFS_WRITE
wfs.GetFeature = ROLE_WFS_READ
- REST服务
路径:%GeoServerHome%/data/security/rest.properties
e.g:<uriPattern>;[<method1>,<method2>…]=<role1>,<role2>
/**;GET,POST,PUT,DELETE=ROLE_ADMINISTRATOR
GET方法具有read-only属性,适合一般用户访问,而POST,PUT,DELETE等方法适合具有一定权限的角色使用。
通过各自路径下存储的properties文件,将资源、操作方法的操作权限分配给各个角色。
需要注意的是:在GeoServer的官方文档中提到,Service粒度的权限控制与Layer粒度的权限控制是无法配合使用的,即这两种控制是相对独立的,你无法指定特定图层中的特定OWS服务的请求和操作权限归属于某一个角色。
好了,以上便是关于GeoServer security模块的基本概念与实现原理,我将争取在这周内实现Spring Security与GeoServer Security的整合,在下一节中介绍如何在自己的Web应用中实现对调用GeoServer中发布的空间数据进行权限管理的内容。
关于如何在你的Web项目中实现对空间数据访问权限的控制(一)的更多相关文章
- 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...
- JAVA WEB项目中各种路径的获取
JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报 分类: JAVA开发(41) 1.可以在s ...
- Web 项目中分享到微博、QQ空间等分享功能
Web 项目中分享到微博.QQ空间等分享功能 网上有很多的模板以及代码,但是有很多都不能分享内容,简单的测试了下: 以新浪微博为例,文本框中的内容是title属性,下面的链接是url属性,如果你的链接 ...
- 【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能
在web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面,而重定向到登陆界面的功能. 项目是用springMVC+spring+hibernate实现 (和这个没有多大关系) 第一步: 首先 ...
- java web项目中 获取resource路径下的文件路径
public GetResource{ String path = GetResource.class.getClassLoader().getResource("xx/xx.txt&quo ...
- web项目中加入struts2、spring的支持,并整合两者
Web项目中加入struts2 的支持 在lib下加入strut2的jar包 2. 在web.xml中添加配置 <filter> <filter-name>struts2< ...
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...
- 转 web项目中的web.xml元素解析
转 web项目中的web.xml元素解析 发表于1年前(2014-11-26 15:45) 阅读(497) | 评论(0) 16人收藏此文章, 我要收藏 赞0 上海源创会5月15日与你相约[玫瑰里 ...
- web项目中 集合Spring&使用junit4测试Spring
web项目中 集合Spring 问题: 如果将 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(& ...
随机推荐
- restful的设计风格
网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...
- Java学习(基本语句,语法,变量)
一.基本语法: public class Demo { //定义一个类 public static void main(String[] args) { //主方法,一切程序的起点 /* 在屏幕上打印 ...
- 【PAT】1005. 继续(3n+1)猜想 (25)
1005. 继续(3n+1)猜想 (25) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中 ...
- hiho1291(逆序思维,并查集)
题目链接:[https://hihocoder.com/problemset/problem/1291] 题意:在<我的世界>游戏中放置沙盒,沙盒为体积为1的正方体,按顺序给你一些坐标,然 ...
- 洛谷 P1115 最大子段和
P1115 最大子段和 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N ...
- [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)
1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 802 Solved: 344[Submit][Sta ...
- 是否排序好了 Exercise07_19
import java.util.Scanner; import java.util.Arrays; /** * @author 冰樱梦 * 时间2018年12月 * 题目:是否排序好了 * */ p ...
- 【洛谷】P1063 能量项链【区间DP】
P1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子, ...
- [BZOJ1005](HNOI 2008)明明的烦恼
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 ...
- Springboot项目与vue项目整合打包
我的环境 * JDK 1.8 * maven 3.6.0 * node环境 1.为什么需要前后端项目开发时分离,部署时合并? 在一些公司,部署实施人员的技术无法和互联网公司的运维团队相比,由于各种不定 ...