Spring Security OpenID 認(rèn)證集成
1. 前言
在前面的小節(jié)我們介紹了多種認(rèn)證解決方案,本節(jié)介紹的是一種互聯(lián)網(wǎng)身份共享方案:「OpenID」。
OpenID 從其名稱可看成,是一種開(kāi)放的身份認(rèn)證標(biāo)準(zhǔn)。
OpenID 的使用廣泛,Google,WordPress,Yahoo 和 PayPal 等知名公司或組織都是用 OpenID 做用戶身份驗(yàn)證標(biāo)準(zhǔn)。
Spring Security 提供了集成 OpenID 認(rèn)證的方法,本節(jié)我們將重點(diǎn)討論如何通過(guò) Spring Security 實(shí)現(xiàn) OpenID 認(rèn)證集成。
2. OpenID 基本原理
OpenID 是一種去中心化的互聯(lián)網(wǎng)身份認(rèn)證解決方案。對(duì)于使用 OpenID 的網(wǎng)站,用戶可以不需要為該網(wǎng)站設(shè)置用戶名密碼,而是使用預(yù)先注冊(cè)好的 OpenID 身份。
簡(jiǎn)單來(lái)說(shuō),OpenID 是一張可以在各個(gè)網(wǎng)站使用的通行證,它實(shí)現(xiàn)的目標(biāo)是注冊(cè)一次身份,同時(shí)可在多個(gè)平臺(tái)使用。
OpenID 的身份標(biāo)識(shí)是以 URI 形式體現(xiàn),每當(dāng)我們?cè)L問(wèn)一個(gè)支持 OpenID 認(rèn)證的網(wǎng)站時(shí),該網(wǎng)站會(huì)自動(dòng)將網(wǎng)頁(yè)跳轉(zhuǎn)到 OpenID 認(rèn)證地址,使用 URI 作為用戶名,并由用戶提供密碼,完成身份認(rèn)證后,用戶訪問(wèn)的目標(biāo)網(wǎng)站便接受了用戶的身份。
更多 OpenID 介紹可訪問(wèn)的官方文檔。
3. Spring Security 實(shí)現(xiàn)方法
3.1 認(rèn)證集成
在 Spring Security 中,使用 Open ID 作為認(rèn)證標(biāo)準(zhǔn)的方式非常簡(jiǎn)單。Spring Security 提供了集成 Open ID 認(rèn)證的標(biāo)簽組件,開(kāi)發(fā)者只需要在表單登錄的頁(yè)面中加入 <openid-logn>
標(biāo)簽即可,完整代碼如下:
<http>
<intercept-url pattern="/**" access="ROLE_USER" />
<openid-login />
</http>
當(dāng)然,我們首先需要配置好 Open ID 的認(rèn)證組件(例如:myopenid.com),并且增加用于認(rèn)證的用戶信息,如:
<user name="https://jimi.hendrix.myopenid.com/" authorities="ROLE_USER" />
配置好后,你就可以使用 myopenid.com 網(wǎng)站作為認(rèn)證服務(wù)。
除此之外,我們還可以指定 UserDetailsService
對(duì)象,用于配置 OpenID 的 user-service-ref
屬性。注意,此處我們雖然也給用戶對(duì)象設(shè)置了密碼屬性,但是該用戶對(duì)象中,我們僅僅是用來(lái)獲取權(quán)限的,其密碼在此處并不生效。但我們依然要保障密碼的復(fù)雜程度,以保障認(rèn)證服務(wù)的安全。
3.2 屬性交換
Spring Security 支持 Open ID 的屬性交換功能。例如,通過(guò)以下配置,我們可以獲取到 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>
本例中,每一個(gè) Open ID 的屬性類型值都是 URI 形式,定義在 https://axschema.org/ 中。required
屬性代表該屬性必須從認(rèn)證中心返回,而屬性的名稱及定義規(guī)范則要和認(rèn)證服務(wù)的定義保持一致。從認(rèn)證中心返回的屬性可以通過(guò)以下形式得到:
OpenIDAuthenticationToken token =
(OpenIDAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();
List<OpenIDAttribute> attributes = token.getAttributes();
OpenIDAuthenticationToken
對(duì)象從 SecurityContextHolder
對(duì)象中獲取。Google,Yahoo 和 MyOpenID 所提供的屬性對(duì)象不盡相同。
4. 小結(jié)
本小節(jié)主要知識(shí)點(diǎn)有:
- OpenID 是一個(gè)廣泛應(yīng)用于互聯(lián)網(wǎng)網(wǎng)站的認(rèn)證方式;
- OpenID 的作用是提供身份識(shí)別的能力;
- OpenID 被一些國(guó)際的主流網(wǎng)站支持,比如 Google,Yahoo 和 MyOpenID 等,在國(guó)內(nèi)尚未出現(xiàn)較權(quán)威的提供方;
- Spring Security 提供了網(wǎng)站 OpenID 認(rèn)證集成的功能。
到此我們對(duì)一些被廣泛應(yīng)用的認(rèn)證授權(quán)方案進(jìn)行了介紹,包括 OAuth2.0、SAML2.0、CAS、JAAS 和 OpenID。下節(jié)我們討論一個(gè)可以提升用戶體驗(yàn)的操作:「記住我」功能的實(shí)現(xiàn)。