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