跟我学SSO-OpenSAML学习资源汇总

摘要:由于最新版本(V3)的 OpenSAML 2015年发布,最新版本为3.3.0于2017年3月发布,目前学习资料不多,本文将汇总 OpenSAML 学习资源,并且简要介绍各种资源的使用方法,方便大家入手学习使用 OpenSAML

OpenSAML 第三版概述

OpenSAML 第三版目前学习资料不多,由于对比第二版在整体使用理念上有大幅度的修改,所以使用方法有很大不同。当然第三版仍然可以按照第二版的方法进行使用,但是这样就放弃了新版本的很多新的特性。

第三版的变化

我们首先介绍一下,OpenSAML 的第三版究竟和之前的版本有什么不同:

模块分割

新版本的 OpenSAML 被分割为多个模块,一共有21个 modules,其中 opensaml-bomopensaml-parent 为结构性 module,剩余的 19 个功能性 module

opensaml-project-structure

opensaml-core 是核心 module,剩余18个,以 apiimpl 结对,共9组,也就是说整个 opensaml 项目一共有9种功能modules。遵循依赖接口而不依赖具体实现的原则,模块间的依赖均为 api 的依赖。

opensaml-api-dependency

通过该图,我们就可以了解各个模块在整个项目中的定位

opensaml-core 除了 opensaml-storage-api 以外所有的模块都依赖。

opensaml-messaging-api 是一个底层的模块,除了 opensaml-storage-apiopensaml-xacml-api 以外都依赖该模块。

opensaml-storage-apiopensaml-xacml-api 这两个模块比较独立,我们主要研究了剩余的模块,这些模块大概的关系是,

首先是 security 相关的模块 opensaml-security-api,在其基础上就是针对XML 安全的模块: opensaml-xmlsec-apiSOAP(Simple Object Access Protoco) 在 XML 安全模块基础上构建。最后 SAML 模块是基于这些模块,同时还有一个针对于 SAMLprofile 定义的抽象模块 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 新版本的特点:

  1. 消息处理的状态,从之前静态的层级上下文变化为新的 emergent 的灵活的层级上下文树。
  2. SAML 编码和解码器也进行了重构

最后还探讨了一下可重用的消息处理模块应该在哪个层次来实现, Chad 认为应该在 IdP 项目中实现,但是 Brent 认为应该在 OpenSAML 中实现,因为 IdP 中的 Action, 使用的是 SpringWebFlow, 这样其他框架下的项目不太容易重用。个人认为有道理,而且在之后的学习中也发现,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.

其他细节

  1. 第三版获取对象构造器,序列化器等的方法更改为使用工厂方法:XMLObjectProviderRegistrySupport, 比如 XMLObjectProviderRegistrySupport.getBuilderFactoryXMLObjectProviderRegistrySupport.getMarshallerFactory().getMarshaller(object)
  2. ArtifactResponse 中的 StatusCode.SUCCESS_URI 更改为 StatusCode.SUCCESS

OpenSAML 学习资源

官方文档

首先就是官方的文档,虽然目前官方文档不多,但是提供了权威的信息:

Shibboleth 全部的 wiki 列表

Project Work Planning,该 wiki 介绍了 OpenSAML 的主要工作和一些其他工作,能够提纲挈领的了解新版本的 OpenSAML 的特性。

Software Design 子目录主要介绍了初始化过程,消息 APISAML 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 的思路来实现相应的功能。这篇博文对这本书进行了部分翻译,大家可以参考下。为了尊重版权,书的内容不会详细列出,但是后续学习内容会包含大部分知识点。