摘要:由于最新版本(V3)的 OpenSAML
2015年发布,最新版本为3.3.0
于2017年3月发布,目前学习资料不多,本文将汇总 OpenSAML
学习资源,并且简要介绍各种资源的使用方法,方便大家入手学习使用 OpenSAML
。
OpenSAML
第三版概述
OpenSAML
第三版目前学习资料不多,由于对比第二版在整体使用理念上有大幅度的修改,所以使用方法有很大不同。当然第三版仍然可以按照第二版的方法进行使用,但是这样就放弃了新版本的很多新的特性。
第三版的变化
我们首先介绍一下,OpenSAML
的第三版究竟和之前的版本有什么不同:
模块分割
新版本的 OpenSAML
被分割为多个模块,一共有21个 modules
,其中 opensaml-bom
和 opensaml-parent
为结构性 module
,剩余的 19 个功能性 module
。
opensaml-core
是核心 module
,剩余18个,以 api
加 impl
结对,共9组,也就是说整个 opensaml
项目一共有9种功能的 modules
。遵循依赖接口而不依赖具体实现的原则,模块间的依赖均为 api
的依赖。
通过该图,我们就可以了解各个模块在整个项目中的定位
opensaml-core
除了 opensaml-storage-api
以外所有的模块都依赖。
opensaml-messaging-api
是一个底层的模块,除了 opensaml-storage-api
和 opensaml-xacml-api
以外都依赖该模块。
opensaml-storage-api
和 opensaml-xacml-api
这两个模块比较独立,我们主要研究了剩余的模块,这些模块大概的关系是,
首先是 security
相关的模块 opensaml-security-api
,在其基础上就是针对XML 安全的模块: opensaml-xmlsec-api
。SOAP
(Simple Object Access Protoco) 在 XML
安全模块基础上构建。最后 SAML
模块是基于这些模块,同时还有一个针对于 SAML
的 profile
定义的抽象模块 opensaml-profile-api
。最后是一个 XACML
(eXtensible Access Control Markup Language)结合 SAML
的模块
XACML(可扩展的访问控制高标识语言)是一种基于XML的开放标准语言,它设计用于描述安全政策以及对网络服务、数字版权管理(DRM)以及企业安全应用信息进行访问的权限。XACML在2003年2月由结构化信息标准促进组织(OASIS)批准,它开发用于标准化XML的访问控制,从而,例如,工人可以使用一个用户名访问多个相关的网址。XACML有时也称可扩展的访问控制高标识语言(XACL)。
XACML设计成与另一个OASIS标准安全性断言标记语言(SAML)协同工作。SAML定义安全系统之间的共享授权信息,例如用户密码和安全检查。使用XACML描述政策的规则引擎(检查已建立的规则并提示与之相符的行为的程序)可将这种信息与已建立的标准比较以判定用户权限。XACML规范是包括IBM、Sun Microsystems和Entrust在内的OASIS成员合作开发的。
SOAP
是一种协议,和 REST
类似,都能实现 WEB
服务器,但是 SOAP
通过 XML
定义 API
访问的语义,而 REST
完全使用 HTTP
协议来表达。参考这篇文章理解 SOAP
已经与 REST
的区别。
消息相关模块
参考官方的项目工作计划中的Messaging-related Components
。里面简要介绍 OpenSAML
的消息机制的思想,并且从顶层讨论了 OpenSAML
新版本的特点:
- 消息处理的状态,从之前静态的层级上下文变化为新的
emergent
的灵活的层级上下文树。 - SAML 编码和解码器也进行了重构
最后还探讨了一下可重用的消息处理模块应该在哪个层次来实现, Chad
认为应该在 IdP
项目中实现,但是 Brent
认为应该在 OpenSAML
中实现,因为 IdP
中的 Action
, 使用的是 Spring
的 WebFlow
, 这样其他框架下的项目不太容易重用。个人认为有道理,而且在之后的学习中也发现,IdP
源码中的一些实现很难重用,最终还是重新包装为 OpenSAML
的接口方法,后续文章会再次谈到该问题。
Metadata Provider
The new metadata support design as discussed with Chad was to split the current monolithic MetadatProvider interface into a 2-part design.
其他细节
- 第三版获取对象构造器,序列化器等的方法更改为使用工厂方法:
XMLObjectProviderRegistrySupport
, 比如XMLObjectProviderRegistrySupport.getBuilderFactory
和XMLObjectProviderRegistrySupport.getMarshallerFactory().getMarshaller(object)
ArtifactResponse
中的StatusCode.SUCCESS_URI
更改为StatusCode.SUCCESS
OpenSAML
学习资源
官方文档
首先就是官方的文档,虽然目前官方文档不多,但是提供了权威的信息:
Project Work Planning,该 wiki
介绍了 OpenSAML
的主要工作和一些其他工作,能够提纲挈领的了解新版本的 OpenSAML
的特性。
Software Design 子目录主要介绍了初始化过程,消息 API
和 SAML Metadata
的支持。其中消息 API 这一节比较重要,在使用中会频繁接触这些方法。
IdP V3 项目wiki 该项目依赖 OpenSAML
,所以有大量的 OpenSAML
的使用案例。
官方 JIRA
OpenSAML JAVA JIRA 遇到问题可以来这里搜搜看,,没准能找到答案。
JIRA
可以通过注册 United ID 来实现登陆,就可以创建 Issue
并且关注某些 Issue
。
源码
shibboleth
有一个独立的 wiki 叫做 Development Center,这里面有一个 Source Code Access 的页面,里面列出了主要的项目的 git 地址。注意源码的地址格式: git://git.shibboleth.net/repository-name
,不同的项目替换后面的额 repository-name
。
另外推荐大家看一下 Java Developer’s Guide,对于阅读源码有一定的帮助。
OpenSAML 源码
Git地址: git://git.shibboleth.net/java-opensaml
使用方法
个人认为最好的阅读源码的方法就是从单元测试入手,这种比较出色的源码单元测试一般都比较全,基本能够覆盖大部分主要功能,遇到一个类不明白是做什么,首先使用 Ctrl+Shift+T
看看有没有对应的测试类,如果有进入查找一下是否有相应的调用。通过执行单元测试,断点调试基本所有的源码都能够理解清楚。
理解了实现源码,自然用起来就游刃有余了。
Shiboleth IdP 源码
Git地址: git://git.shibboleth.net/java-identity-provider
使用方法
英文书籍
目前只有一本官方推荐的: E-book - A Guide to OpenSAML V3,但是个人认为该书并不是很全面,比如 OpenSAML
关键的 Action
就没有介绍,更多的是延续 OpenSAML v2
的思路来实现相应的功能。这篇博文对这本书进行了部分翻译,大家可以参考下。为了尊重版权,书的内容不会详细列出,但是后续学习内容会包含大部分知识点。