Spring Security OpenID 认证集成
1. 前言
在前面的小节我们介绍了多种认证解决方案,本节介绍的是一种互联网身份共享方案:「OpenID」。
OpenID 从其名称可看成,是一种开放的身份认证标准。
OpenID 的使用广泛,Google,WordPress,Yahoo 和 PayPal 等知名公司或组织都是用 OpenID 做用户身份验证标准。
Spring Security 提供了集成 OpenID 认证的方法,本节我们将重点讨论如何通过 Spring Security 实现 OpenID 认证集成。
2. OpenID 基本原理
OpenID 是一种去中心化的互联网身份认证解决方案。对于使用 OpenID 的网站,用户可以不需要为该网站设置用户名密码,而是使用预先注册好的 OpenID 身份。
简单来说,OpenID 是一张可以在各个网站使用的通行证,它实现的目标是注册一次身份,同时可在多个平台使用。
OpenID 的身份标识是以 URI 形式体现,每当我们访问一个支持 OpenID 认证的网站时,该网站会自动将网页跳转到 OpenID 认证地址,使用 URI 作为用户名,并由用户提供密码,完成身份认证后,用户访问的目标网站便接受了用户的身份。
更多 OpenID 介绍可访问的官方文档。
3. Spring Security 实现方法
3.1 认证集成
在 Spring Security 中,使用 Open ID 作为认证标准的方式非常简单。Spring Security 提供了集成 Open ID 认证的标签组件,开发者只需要在表单登录的页面中加入 <openid-logn>
标签即可,完整代码如下:
<http>
<intercept-url pattern="/**" access="ROLE_USER" />
<openid-login />
</http>
当然,我们首先需要配置好 Open ID 的认证组件(例如:myopenid.com),并且增加用于认证的用户信息,如:
<user name="https://jimi.hendrix.myopenid.com/" authorities="ROLE_USER" />
配置好后,你就可以使用 myopenid.com 网站作为认证服务。
除此之外,我们还可以指定 UserDetailsService
对象,用于配置 OpenID 的 user-service-ref
属性。注意,此处我们虽然也给用户对象设置了密码属性,但是该用户对象中,我们仅仅是用来获取权限的,其密码在此处并不生效。但我们依然要保障密码的复杂程度,以保障认证服务的安全。
3.2 属性交换
Spring Security 支持 Open ID 的属性交换功能。例如,通过以下配置,我们可以获取到 Open ID 用户的邮箱和昵称属性:
<openid-login>
<attribute-exchange>
<openid-attribute name="email" type="https://axschema.org/contact/email" required="true"/>
<openid-attribute name="name" type="https://axschema.org/namePerson"/>
</attribute-exchange>
</openid-login>
本例中,每一个 Open ID 的属性类型值都是 URI 形式,定义在 https://axschema.org/ 中。required
属性代表该属性必须从认证中心返回,而属性的名称及定义规范则要和认证服务的定义保持一致。从认证中心返回的属性可以通过以下形式得到:
OpenIDAuthenticationToken token =
(OpenIDAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();
List<OpenIDAttribute> attributes = token.getAttributes();
OpenIDAuthenticationToken
对象从 SecurityContextHolder
对象中获取。Google,Yahoo 和 MyOpenID 所提供的属性对象不尽相同。
4. 小结
本小节主要知识点有:
- OpenID 是一个广泛应用于互联网网站的认证方式;
- OpenID 的作用是提供身份识别的能力;
- OpenID 被一些国际的主流网站支持,比如 Google,Yahoo 和 MyOpenID 等,在国内尚未出现较权威的提供方;
- Spring Security 提供了网站 OpenID 认证集成的功能。
到此我们对一些被广泛应用的认证授权方案进行了介绍,包括 OAuth2.0、SAML2.0、CAS、JAAS 和 OpenID。下节我们讨论一个可以提升用户体验的操作:「记住我」功能的实现。